파게로그

[백준 2108번] 통계학 본문

콤퓨타 왕왕기초/PS

[백준 2108번] 통계학

파게 2020. 11. 15. 16:05

문제 링크: 2108번 통계학

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

 

입력이 500,000개인데 계속해서 시간 초과가 나서 이상하게 생각했는데, 범인은 다른 게 아니라 입력의 문제였다. 개수가 조금만 많다 싶어도 바로 sys.stdin.readline()을 사용하도록 하자!

 

import sys

### 입력
n = int(input())
ls = []

sum = 0
cnt_pos = [0]*(4000+1) # 양수 세기(0 포함)
cnt_neg = [0]*(4000+1) # 음수 세기
for i in range(n):
    t = int(sys.stdin.readline())
    ls.append(t)
    
    # 총합 계산해주기
    sum += t
    
    # 양수 또는 음수 빈도 체크
    if t>=0:
        cnt_pos[t] += 1
    else:
        cnt_neg[-1*t] += 1

### 정렬
ls.sort()

### 산술평균
avg = sum / n

### 중앙값
mid = ls[len(ls)//2]

### 범위
r = ls[-1] - ls[0]

### 최빈값
cnt = [] # [[값, 빈도], ...]
for i in range(len(cnt_pos)):
    if cnt_pos[i] > 0:
        cnt.append([i, cnt_pos[i]])
for i in range(1, len(cnt_neg)):
    if cnt_neg[i] > 0:
        cnt.append([-1*i, cnt_neg[i]])
    
# 값 순으로 정렬 후 빈도 순으로 정렬
cnt = sorted(cnt, key=lambda x: (x[1],x[0]))

freq = cnt[-1][0]
if n > 1 and cnt[-2][1] == cnt[-1][1]:
    idx = len(cnt)-1 # idx는 freq 빈도 중 가장 작은 값
    while (cnt[idx-1][1] == cnt[-1][1]):
        idx -= 1
        if idx == 0: break
    freq = cnt[idx+1][0] # 두 번째로 작은 최빈값을 저장

### 출력
print(int(round(avg, 0)))
print(mid)
print(freq)
print(r)
Comments