안녕하세요 호박감자입니다.
이번엔 2108번 통계학 문제에 대해서 제가 짠 코드를 리뷰해보겠습니다. 이번 코드는 간략히 만 소개하겠습니다.
import sys
def find_frequency(li):
frequency_list = [0] * 8001 # -4000 ~ 4000
for num in li:
ind = num + 4000
frequency_list[ind] += 1
max_num = max(frequency_list)
max_index = frequency_list.index(max_num)
if frequency_list.count(max_num) > 1:
frequency_list[max_index] = 0
return frequency_list.index(max_num) - 4000
input = sys.stdin.readline
N = int(input())
num_list = [int(input()) for _ in range(N)]
sum_num = sum(num_list)
print(round(sum_num / N))
print(sorted(num_list)[N // 2])
print(find_frequency(num_list))
print(max(num_list) - min(num_list))
문제에서 출력해야 하는 것은 4가지로 다음과 같습니다.
1. 산술평균: N개의 수들의 합을 N으로 나눈 값
2. 중앙값: N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
3. 최빈값: N개의 수들 중 가장 많이 나타나는 값
4. 범위: N개의 수들 중 최댓값과 최솟값의 차이
이 문제에서 난관은 최빈값을 찾을 때, 시간 초과가 되지 않도록 하는 점인 것 같습니다.
입력값의 범위는 -4000 ~ 4000으로 0을 포함해 8001칸의 빈도 리스트를 만들었습니다.
+4000 or -4000으로 인덱스의 범위와 입력, 출력 숫자의 범위를 조정하였고,
중요한 규칙은 만일 최빈값을 갖는 숫자가 여러 개라면, 두 번째로 작은 숫자를 출력해야 한다는 점입니다.
저는 이 규칙을 모르고 코드를 짜다가 자꾸 틀려서, 질문검색 창에서 질문들을 보고 이 규칙을 알게 되었습니다.
'백준 문제풀이' 카테고리의 다른 글
백준 4949 파이썬 풀이 (2) | 2022.03.15 |
---|---|
백준 2164 파이썬 풀이 (0) | 2022.03.15 |
백준 2805 파이썬 풀이 (0) | 2022.03.14 |