< 백준 - 2108 > 통계학
문제 :
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오
입력 :
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
출력 :
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
막상 풀고 나니 별로 어렵지도 않은데 제출 17번 만에 풀었다.
< 겨우 푼 내 코드 >
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 | import statistics import sys from collections import Counter N = int(sys.stdin.readline()) l = [] for i in range(N): l.append(int(sys.stdin.readline())) l.sort() # 산술평균 print(round(statistics.mean(l))) # 중앙값 print(statistics.median(l)) # 최빈값 : 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다 mode_list = Counter(l).most_common() if len(l) > 1 : if mode_list[0][1] == mode_list[1][1]: print(mode_list[1][0]) else : print(mode_list[0][0]) else: print(mode_list[0][0]) # 범위 print(max(l)-min(l)) |
이 문제를 풀기 위해 3가지 모듈을 사용했다.
산술평균, 중앙값 등을 빠르게 구하기 위한 statistics 모듈, sys.stdin.readline( )을 사용해 입력값을 받기 위한 sys 모듈, 마지막으로 최빈값 구할 때 사용할 collections 모듈이다.
이 문제가 까다로운 건 '최빈값이 여러 개 일때에는 두 번째로 작은 아이템을 출력하라'는 조건 딱 하나인데 코드를 한 줄 한 줄 보자.
1~3번 줄 : 필요한 모듈 임포트
5번 줄 : 정수 N을 입력받는다.
6번 줄 : 빈 리스트 l 을 만들어 둔다.
7~8번 줄 : N개의 정수를 입력받아 리스트 l에 넣는다.
9번 줄 : l 안에 들어 있는 원소들을 sort( ) 함수를 이용해 오름차순 정렬한다. 이 줄을 누락하면 체점 결과 '틀렸습니다'로 뜬다. sort( )를 해주는 이유는, 최빈값이 여러 개 일때, 두 번째로 작은 값을 출력하라는 조건이 있기 때문에 미리 작은 값 순서대로 정렬해놓은 것이다.
15번 줄 : mode_list 는 리스트 l의 각 원소 출현 횟수를 세어 집합으로 만들고, 해당 집합의 최빈값을 구해 아이템을 넣은 것이다.
이후 ~ 22번 줄까지 : 최빈 값이 여러 개인지 판단하기 위한 조건문
most_common( ) 함수를 사용하는 이유 :
The Counter( ) function returns a dictionary which is unordered.
You can sort it according to the number of counts in each element using most_common( )
0 Comments
Post a Comment