시간제한 | 메모리 제한 | 알고리즘 분류 |
---|---|---|
2초 | 256MB | 수학 , 구현 , 정렬 |
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
첫째 줄에 수의 개수 N(1 <= N <= 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
입력
5
1
3
8
-2
2
출력
2
2
1
10
입력
1
4000
출력
4000
4000
4000
0
입력
5
-1
-2
-3
-1
-2
출력
-2
-2
-1
2
입력
3
0
0
-1
출력
0
0
0
1
사전 자료구조와 카운팅 정렬을 이용하여 문제를 해결하였다.
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])