파게로그
[백준 2108번] 통계학 본문
문제 링크: 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)
'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글
[백트래킹] 백트래킹의 개념 (0) | 2020.11.16 |
---|---|
[백준 11650번] 좌표 정렬하기 (0) | 2020.11.15 |
[백준 11651번] 좌표 정렬하기 2 (0) | 2020.11.15 |
[백준 10814번] 나이순 정렬 (0) | 2020.11.15 |
[백준 1181번] 단어 정렬 (0) | 2020.11.15 |
Comments