jyamethyst21 님의 블로그

백준 2108번- '통계학' (PYTHON 풀이) 본문

CODING 💻

백준 2108번- '통계학' (PYTHON 풀이)

jyamethyst21 2025. 11. 5. 23:41

문제:

 

문제 설명대로 값을 입력받고 산술평균, 중앙값, 최빈값, 범위(최댓값-최솟값)를 출력하면 된다.

 

풀이:

from collections import Counter

N = int(input())
li = []

for i in range(N):
    a = int(input())
    li.append(a)
li.sort()

meann = round(sum(li)/N)
mediann = li[N//2]

counter = Counter(li)
freq = max(counter.values())

modes = []
for k,v in counter.items():
    if v == freq:
        modes.append(k)

modes.sort()

if len(modes) == 1:
    mode_val = modes[0]
else:
    mode_val = modes[1]

range = li[-1] - li[0]

print(int(meann))
print(mediann)
print(mode_val)
print(range)

Counter는 값의 등장횟수를 출력하는 역할을 한다. 딕셔너리처럼 작동하기 때문에 items, value가 다 먹힌다. 이를 활용하면 제일 어렵게 느낄 수 있는 빈도값도 쉽게 출력할 수 있다.

우선 값을 입력받은 뒤 정렬을 해주고, 평균은 전체 합계/길이로 구하고 중앙값은 전체 입력값을 2로 나누어서 그 값이 중앙값이 될테니 인덱싱으로 값을 출력한다. 그리고 빈도수는 Counter를 활용해서 값을 넣어준 다음 value만 비교를 해서 가장 큰 값을 변수에 넣어준다. 그 다음 반복문을 돌려서 가장 큰 값이 있는 키를 추출해서 새로운 리스트에 넣어준다. 이를 또 정렬해서 값이 두개 이상일 경우 두번째로 작은 값을 출력해주면 된다. 코드 자체가 어렵지 않아서 굳이 설명을 보지 않더라도 로직은 이해가 잘 될 것 같다.

 

아, 파이썬으로 돌리면 시간초과가 나서 pypy3로 하니 잘 해결되었다.