수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
숫자들의 산술평균, 중앙값, 최빈값, 범위를 출력하자.
N의 최대 범위가 500,000이기에 시간복잡도에 유의해서 문제를 해결하면 된다.
1) 산술 평균: 각 숫자를 받을 때 sum에 저장한 뒤 N으로 나눈다.
2) 중앙값: 각 숫자를 sorting한 후 N/2의 인덱스를 출력한다.
3) 최빈값: 0 ~ 8001의 배열을 정의한 후 각 숫자가 들어올 때마다 n + 4000의 인덱스를 +1 해준다. 이 중 가장 큰 count의 값중에서 2번째로 큰 값을 출력한다.
4) 범위: 숫자가 들어올 때마다 min_num과 max_num을 비교한 뒤 갱신한다. 그 후 max_num - min_num을 통해서 구한다.
import sys
if __name__ == '__main__':
N = int(sys.stdin.readline().rstrip())
nums = list()
sum_num = 0
min_num = 4000
max_num = -4000
count = [0] * 8001
for _ in range(N):
n = int(sys.stdin.readline().rstrip())
nums.append(n)
sum_num += n
if n > max_num:
max_num = n
if n < min_num:
min_num = n
count[n + 4000] += 1
# 산술 평균
print(round(sum_num / N))
# 중앙값
print(sorted(nums)[N // 2])
# 최빈값
max_count_num = []
max_count = max(count)
for i, c in enumerate(count):
if c == max_count:
max_count_num.append(i - 4000)
if len(max_count_num) >= 2:
print(max_count_num[1])
else:
print(max_count_num[0])
# 범위
print(max_num - min_num)
문제 해결 자체에는 어렵지 않았지만 시간 복잡도 때문에 고생했고 최빈값의 예외 처리에서 문제가 까다로웠던것같다.