Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

hong_mok

[Baekjoon] 2108번: 통계학 본문

Baekjoon

[Baekjoon] 2108번: 통계학

moki 2022. 2. 17. 04:01

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