728x90
https://www.acmicpc.net/problem/2108
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배열에서 가장 높은 값으로 구하면 되는데 최빈값이 여러개인 경우 두번째로 작은 값으로 출력해야하므로 배열을 다시 구해서 출력하면 된다.
'STUDY > Algorithm' 카테고리의 다른 글
[백준] 1916 최소비용 구하기 python (0) | 2021.07.15 |
---|---|
[백준] 14503 로봇 청소기 python, C (0) | 2021.07.13 |
[백준] 16234 인구 이동 python(pypy3) (0) | 2021.07.08 |
[백준] 15686 치킨 배달, python (0) | 2021.07.06 |
[백준] 11054 가장 긴 바이토닉 부분 수열, python (0) | 2021.07.05 |