본문 바로가기
Algorithms/코테 문풀

[백준 2108번] 통계학, 두번째로 작은 최빈값 세기(Counter 활용)

by hi-rachel 2023. 10. 11.

문제

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 


풀이

import sys, math
from collections import Counter

input = sys.stdin.readline

# 산술평균, 중앙값, 최빈값, 범위(최댓값 - 최솟값) 출력

n = int(input())
arr = []

for _ in range(n):
    arr.append(int(input()))

arr.sort()

avg = round(sum(arr) / len(arr))
median = arr[len(arr) // 2]

print(avg)
print(median)

cnt = Counter(arr).most_common()

if len(cnt) > 1 and cnt[0][1] == cnt[1][1]:
    print(cnt[1][0])
else:
    print(cnt[0][0])

diff = max(arr) - min(arr)
print(diff)

중앙값을 찾기 위해 입력 받은 배열을 정렬해준다.

 

최빈값은

max(set(arr), key=arr.count)

위 코드처럼 count를 key로 이용해서 찾아주면 되는데 여기서 최빈값이 여러개 있을 때 두 번째로 작은 값을 찾는 것에서 헤맸다.

 

cnt = Counter(arr).most_common()
print("cnt:", cnt)

if len(cnt) > 1 and cnt[0][1] == cnt[1][1]:
    print(cnt[1][0])
else:
    print(cnt[0][0])

[참고] 파이썬 collections 모듈의 Counter 사용법

 

Counter(arr).most_common()

most_common()이라는 메서드는 데이터의 개수가 많은 순으로 정렬된 배열을 반환한다.

정답 코드에서는 이 정렬된 배열을 받아서 최빈값이 여러 개일 때 만약 첫 번째와 두 번째 최빈값이 동일하다면 두 번째 값을 출력한다.

 

예시)

from collections import Counter

Counter('hello world').most_common()

 

[('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]

 


참고

https://stackoverflow.com/questions/1518522/find-the-most-common-element-in-a-list