본문 바로가기

코딩테스트/BOJ

[백준/파이썬] 2108번: 통계학 (Python)

문제

www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

풀이

 - 구현

 

 - 최빈값의 경우 딕셔너리를 이용해 각 숫자를 key값에, 해당 숫자의 빈도수를 value값에 담았다

 

value값이 가장 큰 값의 key들을 배열에 담아 풀었다.

 

 - 시간초과는 sys.stdin.readline()을 통해 해결했다

코드

import sys

n = int(input())
arr = []
diction = {}
for _ in range(n):
    i = int(sys.stdin.readline())
    arr.append(i)
    if i in diction: # 최빈값 계산을 위해 딕셔너리에 담기
        diction[i] += 1
    else:
        diction[i] = 1

# 산술평균
print(round(sum(arr)/n))

# 중앙값
arr.sort()
i = int(len(arr)//2)
print(arr[i])

# 최빈값
maxNum = 0

arr2 = []
for key, val in diction.items():
    if val > maxNum:
        arr2.clear()
        arr2.append(key)
        maxNum = val
    elif val == maxNum:
        arr2.append(key)
        maxNum = val
arr2.sort() # 최빈값이 여러 개 있을 경우, 최빈값 중 두 번째로 작은 값 출력을 위해 정렬

print(arr2[0]) if len(arr2) == 1 else print(arr2[1])

# 범위
print(arr[len(arr)-1] - arr[0])