STUDY/Algorithm

[백준] 2108 통계학, python

sinawi95 2021. 7. 11. 14:17
728x90

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

 

2108번: 통계학

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

www.acmicpc.net

import sys; input = sys.stdin.readline
N = int(input())
# counting sort
count = [0] * 8001
total = 0
for i in range(N):
    num = int(input())
    count[num + 4000] += 1
    total += num

index = 0
mid = 0
mid_chk = False
min_val = 0
min_chk = False
max_val = 0
for i in range(len(count)):
    if count[i]:
        index += count[i]
        max_val = i - 4000
        if not mid_chk and index > N // 2:
            mid_chk = True
            mid = i - 4000
        if not min_chk:
            min_chk = True
            min_val = i - 4000
tmp = max(count)
tmp_arr = [i - 4000 for i in range(len(count)) if count[i] == tmp]


# 산술평균, 중앙값, 최빈값, 범위
print(round(total/N), mid, tmp_arr[1] if len(tmp_arr) > 1 else tmp_arr[0] , max_val - min_val, sep='\n')

N개의 숫자가 주어졌을때 산술평균, 중앙값, 최빈값, 범위(최대, 최소 차이)를 구하는 문제이고 카운팅 정렬을 사용해서 풀었다.

counting sort를 사용한 이유는 범위가 -4000부터 4000까지로 되어있으므로 8001개의 int 메모리를 잡아둬도 큰 상관없을 것 같았고 최빈값을 구하기에 적절했기 때문이다.

처음 시작할때 숫자를 받아오면서 counting도 하고 total에도 더해준다. 이때 total은 산술 평균을 구할때 쓰인다.

count 배열은 중앙값, 최빈값, 범위를 구할때 사용하는데 배열을 순회하면서 값이 있는경우에 각각 확인한다. 중앙값은 index에 count[i]값을 계속 더하면서 중앙(N//2)을 넘었을때 설정한다. 범위를 구하기 위해서 최소, 최대값을 구해야하는데 최소 값은 제일 처음 만나는 count[i]의 i값으로 설정하고 최대 값은 가장 마지막에 만나는 count[i]의 i값으로 설정한다.

최빈값은 count배열에서 가장 높은 값으로 구하면 되는데 최빈값이 여러개인 경우 두번째로 작은 값으로 출력해야하므로 배열을 다시 구해서 출력하면 된다.