코딩테스트/Python
[Python] 백준 #2108 - 통계학
yo~og
2021. 11. 26. 20:49
https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
풀이
import sys
input = sys.stdin.readline
n = int(input())
dic={}
arr=[]
for _ in range(n):
m = int(input())
if m in dic: dic[m]+=1
else : dic[m]=1
arr.append(m)
dic = sorted(dic.items(),key=lambda x:(-x[1],x[0]))
print(int(round(sum(arr)/n,0)))
print(sorted(arr)[n//2])
if len(dic)<2:
print(dic[0][0])
else:
if dic[0][1] == dic[1][1]:
print(dic[1][0])
else:
print(dic[0][0])
print(max(arr)-min(arr))
산술평균, 중앙값, 최빈값, 범위를 구해야하는 문제이다.
산술평균, 중앙값, 범위는 배열을 이용해서 풀어주었고 최빈값은 딕셔너리를 사용하여 풀어주었다.
- 산술평균은 소수점 이하 첫째 차리에서 반올림한 값을 출력해야하므로 round와 int를 사용해주었다.
- 중앙값은 정렬하고 가장 중앙에 있는 값을 출력해주었다.
- 최빈값은 키는 수, 값은 중복된 갯수로 하여 딕셔너리로 만들어주었다. 그리고 길이가 2보다 작으면 가장 앞의 키를 출력해주었다. 여러개 있을때 최빈값 중 두 번째로 작은 값을 출력해주기 위해서 2보다 크고 첫번째의 값과 두번째의 값이 같으면 즉, 여러개 있으면 dic[1][0]을 출력해주었다.
- 범위는 max와 min을 사용해주었다.
Counter 사용 풀이
import sys
from collections import Counter
input = sys.stdin.readline
n = int(input())
arr=[]
for _ in range(n):
m = int(input())
arr.append(m)
arr.sort()
arr2 = Counter(arr).most_common()
print(round(sum(arr)/n))
print(sorted(arr)[n//2])
if len(arr2)<2:
print(arr2[0][0])
else:
if arr2[0][1] == arr2[1][1]:
print(arr2[1][0])
else:
print(arr2[0][0])
print(max(arr)-min(arr))
Counter을 사용해서 문제를 풀수도 있다.
Counter().most_common()을 사용하면 빈도수가 높은 수 대로 (num,빈도수) 리스트를 만들어준다.
정렬을 해야하므로 Counter을 사용하기 전에 sort를 해주었다.
나머지는 위 풀이와 같다.