[프로그래머스]코딩테스트 입문 | 최빈값 구하기 | dictionary, enumerate()

sun_U·2023년 2월 1일
0
post-thumbnail

문제

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

입출력 예시

풀이 방법

def solution(array):
    cnt_dict = {}
    for n in array:
        if n not in cnt_dict.keys():
            cnt_dict[n] = 1
        else:
            cnt_dict[n] += 1
            
    conv_dict = {v:k for k,v in cnt_dict.items()}
    answer = conv_dict.get(max(list(conv_dict.keys())))
    
    if list(cnt_dict.values()).count(max(conv_dict.keys())) > 1:
        answer = -1

    return answer

나는 dictionary 개념을 이용해서 풀었다.

먼저 배열에서 정수와 정수의 개수를 담을 cnt_dict 빈 딕셔너리를 생성하고 반복문을 통해 정수 값이 key로 없을 경우 새로 생성해 갯수 1을 value로 담고, 이미 있는 경우에는 value에 1씩 더해지도록 만든다.

이 때 정수의 갯수가 values, 최빈값은 keys에 있는데 value로 key값을 찾는 것은 복잡하므로 새로운 사전(conv_dict)을 생성해 keys와 values를 반대로 담았다.
그리고 keys에서 가장 큰 값을 찾아 최빈값 value를 answer에 담아 return한다.

여기서 조건을 주어 정수의 갯수인 cnt_dict의 values에서 max값의 갯수를 세어 최빈값이 1개 이상일 때는 answer가 -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

set(), enumerate(), remove()를 사용한 코드
한 번에 바로 이해가 안가서 천천히 뜯어보며 이해했다.

예를 들어
array= [1, 2, 3, 3, 3] 이면
첫번째 for문에서 (i,a)는 (0, 1), (1, 2), (2, 3)가 되고
array에서 a값을 지우므로 for문이 끝나면 array= [3, 3]만 남게 된다.
여기서 다시 for문을 실행하면 i, a는 0, 3이 되고 배열의 첫번째 3이 지워져 array = [3]가 되고 i가 0에서 반복문이 끝나기 때문에 아래의 if문을 만족해 a값인 3이 return 된다.

최빈값이 여러개면 반복문에서 마지막에 배열의 값이 0이 되므로 -1을 반환한다.

profile
Data Engineer AI/ Metaverse :)

0개의 댓글