본문 바로가기

Baekjoon

[Baekjoon]백준 2108 통계학(실버 3) - Python

문제설명
예제

문제를 살펴보면 길긴하지만 산술평균, 중앙값, 최빈값, 범위를 출력하면 되는 문제이다

산술평균, 중앙값, 범위는 리스트로 표현이 가능하지만 최빈값의 경우 리스트로 표현하면

시간복잡도 측면에서도 불리할 것 같았고, 직관적으로 비교하기 위해 딕셔너리를 활용하였다

 

수를 입력받아 리스트에 추가해주고, 만약 딕셔너리에 해당 숫자가 없다면 value = 1과 함께 추가해준다

만약 존재한다면 value의 값을 늘려주면 된다

평균의 경우 sum의 값을 길이로 나누어주면 되고 중앙값을 구하기 위해선 두 가지로 나누어주어야한다

만약 리스트의 길이가 짝수라면 중앙값이 두개가 되는데 그 두개의 평균을 구해야한다

홀수라면 그 인덱스의 값을 그대로 출력하면 된다

 

최빈값이 제일 복잡한데, value에 넣은 값중에 가장 큰 값을 하나의 변수로 지정한 후에

for문을 통해 딕셔너리를 돌며 변수와 value을 비교하여 값이 같다면 리스트에 추가하면 된다

그렇게 추가한 값을 sort()를 통해 정렬해주고

만약 값이 한 개라면 해당 값을, 여러개라면 앞에서 두번째 값을 출력하면 된다

범위는 처음에 입력받은 리스트에서 max값과 min값을 빼주면 된다

import sys

N = int(input())
num_list = []
num_dic = {}

for _ in range(N):
    num = int(sys.stdin.readline().strip())
    num_list.append(num)
    if num not in num_dic: # 최빈값 확인을 위한 딕셔너리
        num_dic[num] = 1
    else:
        num_dic[num] += 1
        
avg = sum(num_list) / len(num_list) # 평균 구하기
num_list.sort() # 리스트 정렬
# 중앙값 구하기
if len(num_list) % 2 == 0:  
    center = (num_list[len(num_list)//2] + num_list[len(num_list)//2 - 1]) / 2
else:
    center = num_list[len(num_list)//2]
# 최빈값 구하기
max_freq = max(num_dic.values())
num_freq = []
for key, val in num_dic.items():
    if val == max_freq:
        num_freq.append(key)
num_freq.sort()
if len(num_freq) != 1: # 여러 개일 경우 두 번째로 작은 값
    freq = num_freq[1]
else:
    freq = num_freq[0]

print(round(avg)) # 반올림
print(center) # 중앙값
print(freq) # 최빈값
print(max(num_list) - min(num_list)) # 범위

조금 길긴 하지만 차분히 생각하면 어렵지 않게 해결가능하다