본문 바로가기
Computer Science/Algorithm

[백준] 2108번 통계학, 중앙값: 인덱스 조심(반올림 말고 내림)

by 9루트 2023. 1. 7.

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

 

문제 풀이

# BOJ_2108
import math

# 수 입력
n = int(input())
nums = []
for i in range(n):
    nums.append(int(input()))


# 1. 산술평균 구하기
sum = 0
for num in nums:
    sum += num
print(round(sum / n))

# 2. 중앙값 구하기
nums.sort() # 오름차순으로 정렬
index = math.floor(n / 2)
print(nums[index])

# 3. 최빈값 구하기
count_dic = {}
for num in nums:
    if num in count_dic:
        count_dic[num] += 1
    else:
        count_dic[num] = 1
# count_dic value 값을 기준으로 내림차순 정렬 후 리스트로 만들기
count_list = sorted(count_dic.items(), key=lambda x: x[1], reverse=True)
# print(count_list)
if len(count_list) == 1:
    print(count_list[0][0])
else:
    if count_list[0][1] == count_list[1][1]: # 같으면 두번째 수 출력
        print(count_list[1][0])
    else: # 첫번째 수 출력
        print(count_list[0][0])

# 4. 범위
print(max(nums) - min(nums))

 

눈여겨 볼 부분은

1. 중앙값의 인덱스

2. 최빈값의 딕셔너리를 정렬한 후 튜플 값을 통해 두번째 작은 수를 구하는 과정

 

 


1. 중앙값의 인덱스는 round(n/2)로 하였으나 

예시

7
1
1
2
2
3
3
4

결과

2
2
2
3

결과에서 2323이 나오는 바람에 원인을 찾게 되었다.

인덱스는 0부터 시작하므로

반올림이 아니라 내림으로 해야 정확히 7의 중간값인 4 > 인덱스로는 3으로 가게 된다.

즉 7/ 2 = 3.5 > 내림으로 3으로 인덱스를 만들어 주어야 한다.

 

import math > index = math.floor(n / 2) 이용할 것

 

 


2. 최빈값의 딕셔너리를 정렬한 후 튜플 값을 통해 두번째 작은 수를 구하는 과정

count_dic value 값을 기준으로 내림차순 정렬 후 리스트로 만들기

[(1, 2), (2, 2), (3, 2), (4, 1)]

해당 리스트에서 

튜플 안에 첫번째 값은 입력된 수를 의미하고, 두번째 값은 입력된 수가 몇 번 나왔는지 빈도수를 의미한다.

따라서 빈도수를 기준으로 내림차순 정렬한 후에

맨 앞과 맨 뒤의 빈도수가 같으면 두번째 입력된 수 2를 출력하도록 한다.

맨 앞과 맨 뒤의 빈도수가 다르면 바로 첫번째 입력된 수 1을 출력하도록 한다.

 

위 리스트에서는 빈도수가 같으므로 두번째 입력된 수 2를 출력하도록 한다.