최빈값 구하기

2024. 7. 6. 18:00코딩테스트 입문

https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.


제한사항

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

입출력 예

array result
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

입출력 예 설명
입출력 예 #1

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 예 #2

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 예 #3

  • [1]에는 1만 있으므로 최빈값은 1입니다.

최빈값을 구하는 문제입니다.

조금 특이한 점이라면, 최빈값이 중복될 수도 있다는 점입니다. 만약 최빈값이 2개 이상이면 -1을 반환해야 합니다.

이래서 이 문제는 statistics 패키지의 mode를 사용할 수 없습니다. mode는 첫 번째로 나온 최빈값을 반환하기 때문입니다.

저는 collections 패키지의 Counter을 사용해 문제를 풀어보겠습니다.

from collections import Counter
def solution(array):
    count = Counter(array)
    # 횟수 세기
    max_count = max(count.values())
    # 가장 많은 횟수를 가지는 값들 찾기
    most_common = [key for key, value in count.items() if value == max_count]
    # 2개 이상이면 -1 반환
    if len(most_common) >= 2:
        return -1
    return most_common[0]

Counter 객체를 생성하여 각 요소가 몇 번 등장했는지 계산합니다.

그 다음, 가장 많이 등장한 횟수를 따로 기록해둡니다.

 

이후 most_common 리스트에 가장 많이 등장한 숫자들을 전부 포함시킵니다.

만약 리스트의 길이가 2 이상이라면, 최빈값이 2개 이상이므로 -1을 반환합니다.

길이가 1이라면, 해당 리스트의 첫번째 요소(인덱스 0)을 반환합니다.

 

다른 사람의 풀이 중 패키지 없이 푼 풀이가 있습니다.

def solution(array):
    while len(array) != 0:
        for i, a in enumerate(set(array)):
            array.remove(a)
        if i == 0: return a
    return -1

이건 array에서 모든 값이 삭제될 때까지 반복하는 코드입니다.

먼저 array의 집합으로 중복을 모두 제거한 뒤, 인덱스와 값을 동시에 추출합니다.

그 다음, array에서 해당 값이 첫번째로 나타나는 곳을 삭제합니다. 그러면 array에는 해당 값 하나가 삭제됩니다.

이걸 계속 반복하다보면 최빈값만 남게 됩니다. 따라서 i가 0이라면, a를 반환하면 됩니다.

i가 0이 아니라면 최빈값이 둘 이상이라는 뜻이므로 -1을 반환합니다.

 

최빈값의 특성을 활용한 멋진 풀이였습니다.

'코딩테스트 입문' 카테고리의 다른 글

피자 나눠 먹기 (1)  (0) 2024.07.08
짝수는 싫어요  (0) 2024.07.07
중앙값 구하기  (0) 2024.07.05
나머지 구하기  (0) 2024.07.04
배열 두 배 만들기  (0) 2024.07.03