티스토리 뷰

728x90
반응형

문제

 

www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

 

코드

import sys
from collections import Counter
N = int(sys.stdin.readline())

k = []

for i in range(N):
    k.append(int(sys.stdin.readline()))
    
k.sort()
#산술평균
print(int(round(sum(k)/N,0)))

#중앙값
print(k[N//2])

#최빈값
f = Counter(k) # 딕셔너리 형태로 출력 Counter({-2: 1, 1: 1, 2: 1, 3: 1, 8: 1})

b = f.most_common() # 빈도수가 높은순으로 투플형태로 출력 [(-2, 1), (1, 1), (2, 1), (3, 1), (8, 1)]

if len(k) >1: #만약 입력값이 하나면, 그게 최빈값이므로 예외처리
    if b[0][1] == b[1][1]:
        print(b[1][0]) # 최빈값의 빈도수를 비교하여, 2개이상의 최빈값이 있으면 두번쨰로 작은것을 출력
    else:
        print(b[0][0])
else:
    print(k[0])

#범위
print(k[-1] - k[0])

 

코드설명

입력된 값들에 대하여 산술평균, 중앙값, 최빈값, 범위를 구하는 문제이다.

 

산술평균은 sum()을 이용해 리스트 값들을 전부 더한 다음 N으로 나눠주고 round 함수를 사용해 반올림을 해주면 된다.

 

중앙값은 N을 2로 나눈 몫으로 인덱스를 사용해 나타내고

 

최빈값은 라이브러리 Counter를 사용해 딕셔너리 형태로 만들어주고 most_common() 함수를 사용해 빈도수가 높은 순으로 투플 형태로 만들어준다. 문제에 최빈값이 여러개라면 두번째로 작은 값을 출력하라고 나와있어서 로직을 따로 만들어 줘야한다.

 

범위는 N개의 수 들중 최댓값과 최솟값의 차이이기 때문에 k[-1] 에서 k[0]을 빼주면 된다.

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31