백준 문제 풀이 - 통계학 2108번

Joonyeol Sim👨‍🎓·2022년 1월 23일
0

백준문제풀이

목록 보기
75/128

📜 문제 이해하기

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

💡 문제 재정의

숫자들의 산술평균, 중앙값, 최빈값, 범위를 출력하자.

✏️ 계획 수립

N의 최대 범위가 500,000이기에 시간복잡도에 유의해서 문제를 해결하면 된다.
1) 산술 평균: 각 숫자를 받을 때 sum에 저장한 뒤 N으로 나눈다.
2) 중앙값: 각 숫자를 sorting한 후 N/2의 인덱스를 출력한다.
3) 최빈값: 0 ~ 8001의 배열을 정의한 후 각 숫자가 들어올 때마다 n + 4000의 인덱스를 +1 해준다. 이 중 가장 큰 count의 값중에서 2번째로 큰 값을 출력한다.
4) 범위: 숫자가 들어올 때마다 min_num과 max_num을 비교한 뒤 갱신한다. 그 후 max_num - min_num을 통해서 구한다.

💻 계획 수행

import sys

if __name__ == '__main__':
    N = int(sys.stdin.readline().rstrip())
    nums = list()
    sum_num = 0
    min_num = 4000
    max_num = -4000
    count = [0] * 8001
    for _ in range(N):
        n = int(sys.stdin.readline().rstrip())
        nums.append(n)
        sum_num += n
        if n > max_num:
            max_num = n
        if n < min_num:
            min_num = n
        count[n + 4000] += 1

    # 산술 평균
    print(round(sum_num / N))

    # 중앙값
    print(sorted(nums)[N // 2])

    # 최빈값
    max_count_num = []
    max_count = max(count)
    for i, c in enumerate(count):
        if c == max_count:
            max_count_num.append(i - 4000)

    if len(max_count_num) >= 2:
        print(max_count_num[1])
    else:
        print(max_count_num[0])

    # 범위
    print(max_num - min_num)

🤔 회고

문제 해결 자체에는 어렵지 않았지만 시간 복잡도 때문에 고생했고 최빈값의 예외 처리에서 문제가 까다로웠던것같다.

profile
https://github.com/joonyeolsim

0개의 댓글