공부 기록장

백준 2108. 통계학 본문

코딩 테스트/백준 문제 풀이

백준 2108. 통계학

빛나무 2023. 12. 31. 21:30

문제 설명

N(홀수)개의 수가 주어졌을 때, 아래의 통계값들을 구하기

1. 산술평균 : N개의 수들의 합을 N으로 나눈 값

2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값

3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값

4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

 

입력

첫째 줄에 수의 개수 N( 1 ≤ N ≤ 500,000 )이 주어지고, N은 홀수이다

그 이후 N개의 줄에 정수들이 주어진다.

입력되는 정수의 절댓값은 4,000을 넘지 않는다.

 

출력

산술평균은 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

최빈값은 여러 개 있을 경우 두 번째로 작은 값을 출력한다.

 

코드

from collections import Counter
import sys

n = int(sys.stdin.readline())
num = []
for i in range(n):
    num.append(int(sys.stdin.readline()))
num.sort()

# 1. 산술평균
print(round(sum(num)/n))

#2. 중앙값
print(num[len(num)//2])

#3. 최빈값
tmp = Counter(num).most_common(2) # 최빈값 상위 2개 출력
# print(tmp)
if len(tmp) > 1:
    if tmp[0][1] == tmp[1][1]:
        print(tmp[1][0])
    else:
        print(tmp[0][0])
else:
    print(tmp[0][0])

# 4. 범위
print(num[len(num)-1] - num[0])

 

가장 까다로운 부분은 최빈값을 구하는 부분이었다.

collections 라이브러리의 Counter를 활용하면 쉽게 구할 수 있다.

 

Counter의 most_common(n) 함수는 n번째 최빈값까지 구해주는데

튜플을 원소로 갖는 리스트로 반환을 해준다.

num = [3,3,3,2,2,1]
print(Counter(num).most_common(2))  # [(3, 3), (2, 2)]

 

또한, 산술평균을 구할 때

round 함수를 활용해서 원하는 자리 수에서 반올림을 할 수 있다.

두 번째 인자를 적지 않으면, 첫 번째 자리에서 반올림하여 정수를 반환한다.