Algorithm/BaekJoon

(파이썬) 백준 2108번 "통계학"

innit 2022. 5. 21. 18:10


# 답

Counter 라이브러리를 사용하지 않은 풀이

import sys
input = sys.stdin.readline

N = int(input())
arr = [int(input()) for _ in range(N)]
arr.sort()

d = dict()
for item in arr:
    if item in d:
        d[item] += 1
    else:
        d[item] = 1

m = 0
tmp = list()
for k, v in list(d.items()):
    if v > m:
        tmp = [k]
        m = v
    elif v == m:
        tmp.append(k)
tmp.sort()

# 산술평균
print(round(sum(arr) / N))
# 중앙값
print(arr[N // 2])
# 최빈값
if len(tmp) == 1:
    print(tmp[0])
else:
    print(tmp[1])
# 범위
print(arr[-1] - arr[0])

 

Counter 라이브러리를 사용한 풀이

import sys
from collections import Counter
input = sys.stdin.readline

N = int(input())
arr = [int(input()) for _ in range(N)]
arr.sort()
tmp = Counter(arr).most_common(2)

# 산술평균
print(round(sum(arr) / N))
# 중앙값
print(arr[N // 2])
# 최빈값
if len(tmp) == 1 or tmp[0][1] != tmp[1][1]:
    print(tmp[0][0])
else:
    print(tmp[1][0])
# 범위
print(arr[-1] - arr[0])

 

 

 

 


# 풀이 과정

 

최빈값을 구하는 것이 조금 까다로운 문제입니다. 리스트의 count 메서드를 사용할 경우 시간초과가 나서 다른 방법으로 최빈값을 구해주어야합니다.

 

저는 우선 딕셔너리의 key에 숫자들을 써넣어주고, value에 각 숫자가 출현한 빈도를 저장했습니다.

d = dict()
for item in arr:
    if item in d:
        d[item] += 1
    else:
        d[item] = 1

 

그 후, value가 최대인 key들을 찾아 새로운 리스트(tmp)에 담아주었습니다.

m = 0
tmp = list()
for k, v in list(d.items()):
    if v > m:
        tmp = [k]
        m = v
    elif v == m:
        tmp.append(k)
tmp.sort()

 

이렇게 직접 각 숫자의 출현 빈도를 세 주어도 되지만, Counter 라이브러리를 사용하면 좀 더 쉽고 빠르게 각 요소의 출현 빈도를 알 수 있습니다. 

 

다음과 같이 Counter 라이브러리를 import해 주고, Counter 메서드에 리스트를 입력하면 자동으로 리스트의 각 요소들이 몇 개 들어있는지 딕셔너리로 만들어서 반환해줍니다.

most_common(x) 메서드를 사용하면 빈도가 높은 것부터 x개까지 차례대로 정렬하여 리스트로 반환합니다.

from collections import Counter

Counter([1, 1, 2, 2, 4])				# Counter({1: 2, 2: 2, 4: 1})
Counter([1, 1, 2, 2, 4]).most_common()	# [(1, 2), (2, 2), (4, 1)]

 

 

 

 

728x90
반응형