본문 바로가기
문제 풀이/백준(BOJ)

[Python] 백준 2108번 : 통계학

by 희조당 2022. 6. 21.
728x90

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net


 문제 풀이

수학적인 능력을 물어보는 구현 문제이다.

문제에서 물어보는 대로 따라가면 된다.

 

산술평균 : n개의 수를 합 합해서 n으로 나눈 뒤 반올림하면 된다. 

 statistics 라이브러리에 있는 mean() 함수를 써도 상관은 없는데 오히려 메모리와 시간을 잡아먹는다.

중앙값 : n이 무조건 홀수로 주어지기 때문에 (n+1)/2 -1 이 무조건 중앙값이다!

최빈값 : 빈도를 따지기 위해서 딕셔너리를 사용했다. key (숫자) : value (빈도수)

  최고 빈도를 구하고 loop를 돌려 최고 빈도가 아닌 키값 쌍을 지워버리면 된다.

  남아있는 딕셔너리의 key(value도 상관없음)의 개수가 1이 아니면 유일한 최빈값이 아니므로

  정렬했을 때 2번째 값이 최빈값이 된다. 유일하면 남은 녀석이 최빈값.

범위 : 최댓값에서 최솟값을 빼면 된다.

 느낀 점

c++로 풀 때는 최빈값이 정말 까다로웠는데 파이썬은 정말... 말도 안 되게 편리한 것 같다. 최빈값보다 산술평균과 중앙값 따지는 게 더 오래 걸렸다. 왜냐하면 파이썬 문법을 잘 몰라서...

 코드

import sys

n = int(sys.stdin.readline())
num = [int(sys.stdin.readline()) for i in range(n)]
dict = {}

for i in num:
    if i in dict: dict[i] += 1
    else: dict[i] = 1
    
max_cnt = max(dict.values())
for i in num:
    if i in dict and dict[i] != max_cnt:
        del dict[i]
        
mode = sorted(dict)[0] if len(dict.keys()) == 1 else sorted(dict)[1]

print(round(sum(num)/n))
print(sorted(num)[int((n+1)/2-1)])
print(mode)
print(max(num) - min(num))

댓글