Programming/SW Expert Academy

20210116 // 삼성 SW Expert 아카데미 // 1204

껨코 2021. 1. 16. 14:44

삼성 SW Expert 아카데미 1204번 "최빈수 구하기" 문제입니다.

from collections import Counter
 
def modefinder(nums):
    c = Counter(nums)
    order = c.most_common()
    maximum = order[0][1]
     
    modes = []
    for num in order:
        if num[1] == maximum:
            modes.append(num[0])
    return modes
 
TC = int(input())
for tc in range(1, TC+1):
    N = int(input())
    lst = list(map(int, input().split()))
    modes_lst = modefinder(lst)
    modes_lst.sort()
    modes_lst.reverse()
    print("#%s"%tc, modes_lst[0])

숫자들의 리스트를 입력받고 최빈수(가장 빈도가 많은 수)를 찾아서 출력하는 문제이다.

 

이 문제는 collections 모듈의 Counter 클래스를 사용하면 편한 문제다.

 

Counter 클래스의 most_common() 메서드는 받은 리스트를 딕셔너리 형태로 저장하여 가장 빈도가 높은 순서대로 정렬해주는 매서드이다.

 

예를 들어 "Hello world"를 Counter 클래스로 만들어서 most_common() 메서드를 호출하면

 

{'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

 

같은 식으로 데이터를 추출할 수 있다.

 

이런 식으로 가장 빈도가 높은 숫자를 추출하여 modes_lst에 저장을 하면 1개 이상의 숫자가 들어갈 텐데

 

문제에서는 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라고 나와있으므로 sort()와 reverse() 메서드를 사용하여 내림차순으로 정렬한 후에 modes_lst[0](가장 큰 수)를 출력하면 된다.