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
반응형