<문제>
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
<입력>
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
<출력>
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
시간초과
문제점1. 시간초과
import sys
N = int(sys.stdin.readline())
def main(N):
medi = []
for i in range(0, N):
medi.append(int(sys.stdin.readline()))
medi.sort()
print(round(sum(medi)/N))
print(medi[N//2])
medi_set = list(set(medi))
medi_list = [0,] *len(medi_set)
for i in range(0, len(medi_list)):
medi_list[i] = medi.count(medi_set[i])
for i in range(0, len(medi_list)):
if medi_list[i] != max(medi_list):
del(medi_set[i])
if len(medi_set) == 1:
print(medi_set[0])
else:
print(medi_set[1])
print(medi[N-1]-medi[0])
main(N)
import sys
ndict = {i:0 for i in range(-4000,4001)}
# n 의 갯수
numOfN = int(sys.stdin.readline().rstrip())
# 사전 자료구조를 만들어서 개수를 구함
for i in range(numOfN):
inp = int(sys.stdin.readline().rstrip())
ndict[inp] += 1
nlist = []
# 카운팅 정렬으로 값을 넣어줌
for [key, value] in ndict.items():
for _ in range(value):
nlist.append(key)
# 최빈 값을 구하기 위한 리스트
orderByCommon = sorted(ndict.items(), key=lambda item:item[1], reverse=True)
# 산술 평균
print(round(sum(nlist)/numOfN))
# 중앙 값
print(nlist[numOfN//2])
# 최빈 값
if len(orderByCommon) > 1:
if orderByCommon[0][1] == orderByCommon[1][1]:
print(orderByCommon[1][0])
else: print(orderByCommon[0][0])
else:
print(orderByCommon[0][0])
# 범위
print(nlist[-1]-nlist[0])
🔗백준 - 통계학
https://www.acmicpc.net/problem/2108