본문 바로가기

코딩테스트/Python

[Python] 백준 #2108 - 통계학

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))

산술평균, 중앙값, 최빈값, 범위를 구해야하는 문제이다.

산술평균, 중앙값, 범위는 배열을 이용해서 풀어주었고 최빈값은 딕셔너리를 사용하여 풀어주었다.

 

  1. 산술평균은 소수점 이하 첫째 차리에서 반올림한 값을 출력해야하므로 round와 int를 사용해주었다.
  2. 중앙값은 정렬하고 가장 중앙에 있는 값을 출력해주었다.
  3. 최빈값은 키는 수, 값은 중복된 갯수로 하여 딕셔너리로 만들어주었다. 그리고 길이가 2보다 작으면 가장 앞의 키를 출력해주었다. 여러개 있을때 최빈값 중 두 번째로 작은 값을 출력해주기 위해서 2보다 크고 첫번째의 값과 두번째의 값이 같으면 즉, 여러개 있으면 dic[1][0]을 출력해주었다.
  4. 범위는 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를 해주었다.

나머지는 위 풀이와 같다.