본문 바로가기

백준 문제/파이썬

백준 2108 통계학(python)-[sliver(3)]

728x90

문제-https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

코드


import sys
N = int(sys.stdin.readline())
a = []
p3 = []
dic = {}
for i in range(N):
    a.append(int(sys.stdin.readline()))
a.sort()
print(round(sum(a)/N))
print(a[int(N/2)])
N 입력받을 수
a 입력 받아 저장할 리스트
p3 최빈값
dic 최빈값 구하기 위한 딕셔너리

-시간 초과의 이유로 sys.stdin.readline()을 사용하였다.

-첫 번째 출력값은 평균, 첫째 자릿수에서 반올림을 위해 round를 사용하였다.

-두 번째 출력값은 중앙값으로 정렬된 리스트를 이용해 N/2를 하여 값을 출력한다.

 

for i in a:
    try:
        dic[i] += 1
    except KeyError:
        dic[i] = 1
    
dic_max=max(dic.values())
for i in dic:
    if(dic[i]==dic_max):
        p3.append(i)
if(len(p3)==1):
    print(p3[0])
else:
    print(p3[1])
print(a[N-1]-a[0])

-세 번째 값은 딕셔너리를 사용해 딕셔너리에 있다면 value에 +1을, 없으면 오류가 뜨기에 이를 try, except를 이용하여 새로 값을 추가해 준다.

-값 중 최댓값을 구하는 함수(max)에서 dic.values()를 이용하여 최대 빈도수를 저장한다. 이후 for문을 이용하여 p3에 최댓값을 저장, 만약 한 개면 바로 출력, 아니라면 2번째 값을 출력한다.

-여기서 순서대로 리스트에 삽입되어 따로 정렬 필요 X

-네 번째 값은 빈도수기에 최댓값-최솟값을 해준다.

 

결과


input:
5
-1
-2
-3
-1
-2

ouput:
-2
-2
-1
2

 

728x90