[26.08.12] 최빈값 구하기

장서영·2026년 8월 12일

알고리즘

목록 보기
11/11

프로그래머스 > 최빈값 구하기

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

def solution(array):
    arr = sorted(array)
    answer = {}
    cnt = 0

    i = 0
    while i < len(arr): 
        cnt = arr.count(arr[i])
        answer[arr[i]] = cnt
        i += cnt
    
    #가장 큰 값을 가진 키 찾기
    #1. 가장 큰 value를 찾기
    #2. 그 value를 가진 키 값을 찾기
    #3. 만약 여러 개라면 -1 반환
    max_value = max(answer.values())
    temp = []
    for k,v in answer.items():
        if max_value == v:
            temp.append(k)
    
    if len(temp) > 1:
        return -1
    
    return temp[0]

MADE BY ME

입력: array(정수배열)
출력: answer(최빈값) / -1(최빈값 여러개일 때)

1) array의 "원소값:빈도수"를 키-밸류 쌍으로 갖는 딕셔너리 answer를 만듦

  • array를 오름차순하여 중복된 원소의 갯수를 구해, 그 다음으로 큰 원소의 인덱스를 찾는 방식을 사용했다.

2) answer에서 value(빈도수)가 가장 큰 key(원소값)을 찾아 temp 리스트에 보관했다.

  • 만약 여러 개라면 -1을 반환 / 한 개뿐이라면 그 원소를 반환

다른 코드 인사이트: 내 거랑 뭐가 다를까?

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

알고리즘 동작 방식: 배열에 존재하는 값을 종류별로 1개씩 지워나가면서 끝까지 살아남는 원소를 찾음

  • set()으로 배열에 존재하는 값을 1개씩 집합으로 만듦
  • enumerate()로 인덱스(i)와 값(a)을 하나씩 빼내어 array에서 그 값을 하나씩 지워감
    ※ 왜 굳이 enumerate()를 써서 i를 처리했을까?
    -> for문을 다 돌았을 때 i가 0이라는 건, 마지막 살아남은 값이 a뿐이라는 것을 확인할 수 있다!
  • 마지막에 return -1이라는 건, while문 조건인 array가 텅 비었다는 것. 즉, 최후의 1인을 가려내지 못하고 동반 우승으로..함께 remove 되어버림..

진짜 리스펙한 코드다...
다만, array.remove()는 O(N)의 시간복잡도를 가져 배열이 커지면 매우 느려지고, for문 밖에서 루프 변수를 사용하는 것은 가독성을 떨어트리므로 좋은 코드는 아니라고 한다..


💡추가로 알게 된 것: 파이썬의 스코프 규칙
"i가 for문 밖에 있는데도 에러 나지 않는 이유"
: C, java와 달리 파이썬은 함수 단위로 스코프(범위)를 관리하기 때문에 for문이나 if문 내부에서 생성된 변수는 블록이 끝나도 사라지지 않고 해당 함수 내에서 계속 유효하다. 다만, for문이 최소 한 번이라도 돌아가야 한다. (안그러면 UnboundLocalError가 발생할 수 있음)

profile
하루살이 개발자

0개의 댓글