hong_mok
[Baekjoon] 2108번: 통계학 본문
2108번: 통계학
문제
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
5
1
3
8
-2
2
출력
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
2
2
1
10
방법
우선 병합 정렬을 사용하여 정렬된 리스트를 구한다.
- 산술평균 : 합계 / 개수
- 중앙값 : N이 홀수이므로 정렬된 리스트에서 인덱스가 N//2
인 자료
- 범위 : 오름차순으로 정렬된 리스트이므로 마지막 값 - 첫번째 값
- 최빈값 : 빈도수를 계산할 딕셔너리를 생성한 후, 리스트를 순회하면서 빈도수를 체크한다.
코드
import sys
input = sys.stdin.readline
def merge_sort(num_list) :
# 생략
def merge(nums1, nums2) :
# 생략
num_list = []
N = int(input())
for _ in range(N) :
num = int(input())
num_list.append(num)
sorted_list = merge_sort(num_list) # 리스트 오름차순 정렬
list_sum = 0 # 합계를 저장할 변수
dict_count = {} # 빈도 수를 저장할 변수. key: 자료, value: 빈도 수
for num in sorted_list : # 리스트를 순회하면서 합계와 빈도수를 구한다.
list_sum += num
dict_count[num] = dict_count.get(num, 0) + 1
# 딕셔너리를 value값을 기준으로 내림차순 정렬한다.
mode_list = sorted(dict_count.items(), key=lambda x: x[1], reverse=True)
print("%.0f" % (list_sum / N)) # 1. 산술평균
print(sorted_list[N//2]) # 2. 중앙값
# 최빈값
if len(mode_list) == 1 : # 자료의 종류가 하나일때는 그 자료 출력
print(mode_list[0][0])
elif mode_list[0][1] == mode_list[1][1] : # 만약 빈도수가 같은 자료가 여러개라면 두번째로 큰 자료 출력
print(mode_list[1][0])
else :
print(mode_list[0][0]) # 아니라면 제일 많이 나온 값 출력
print(sorted_list[-1] - sorted_list[0]) # 4. 범위
'Baekjoon' 카테고리의 다른 글
[Baekjoon] 4949번: 균형잡힌 세상 (0) | 2022.02.23 |
---|---|
[Baekjoon] 2447번: 별 찍기 - 10 (0) | 2022.02.17 |
[Baekjoon] 1002번: 터렛 (0) | 2022.02.17 |
[Baekjoon] 1011번: Fly me to the Alpha Centauri (0) | 2022.02.17 |
Comments