본문 바로가기

백준 문제풀이

백준 2108 파이썬 풀이

안녕하세요 호박감자입니다.

이번엔 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