Altiora Petamus

통계학 본문

1day-1algorithm

통계학

Haril Song 2021. 6. 22. 21:47
 

2108번: 통계학

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

www.acmicpc.net

🤔생각해보기

이 문제는 사실상 최빈값을 구하라는 문제. 나머지는 단순한 연산으로도 구할 수 있다.

최빈값을 구하기 위해 여러가지 방법을 썼지만, 시간초과로 해결하지 못했었는데 Counter를 쓰면 갯수를 세야할 때 아주 편리하다는 것을 알게 되었다.

시간초과

# 최빈값(mode) ; N개의 수들 중 가장 많이 나타나는 값
modes = sorted(numbers, key=lambda x: numbers.count(x), reverse=True)
if len(modes) == 1:
    print(modes[0])
else:
    for mode in modes:
        if mode > modes[0]:
            print(mode)
            break
  • 람다를 써서 정렬해두고 루프를 돌다가 값이 더 큰 값이 오면 두 번째로 작은 값이 되므로 출력하고 루프를 빠져나오는 방식이다.
  • 배열의 길이에 따라 시간이 오래걸리게 되서 효율적이지 못한 방식이다.

해결 코드

# 최빈값(mode) ; N개의 수들 중 가장 많이 나타나는 값
def mode(arr):
    mode_dict = Counter(arr)
    modes = mode_dict.most_common()
    if len(arr) > 1:
        if modes[0][1] == modes[1][1]:
            return modes[1][0]
        else:
            return modes[0][0]
    else:
        return modes[0][0]

Counter 를 사용하면 딕셔너리 구조로 만들 수 있고, 그 딕셔너리에서 most_common() 메서드를 사용해서 최빈값을 구할 수 있다. 같은 빈도를 가진다면 원래 시퀀스 순서대로 나열된다.

전체 코드

import sys
from collections import Counter

N = int(sys.stdin.readline())

numbers = sorted([int(sys.stdin.readline()) for _ in range(N)])


# 산술평균 : N개의 수들의 합을 N으로 나눈 값
def mean(arr):
    return round(sum(arr) / N)


# 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
def median(arr):
    return arr[N // 2]


# 최빈값(mode) ; N개의 수들 중 가장 많이 나타나는 값
def mode(arr):
    mode_dict = Counter(arr)
    modes = mode_dict.most_common()
    if len(arr) > 1:
        if modes[0][1] == modes[1][1]:
            return modes[1][0]
        else:
            return modes[0][0]
    else:
        return modes[0][0]


# 범위 : N의 수들 중 최댓값과 최솟값의 차이
def scope(arr):
    return max(arr) - min(arr)


print(mean(numbers))
print(median(numbers))
print(mode(numbers))
print(scope(numbers))

'1day-1algorithm' 카테고리의 다른 글

단어 변환  (0) 2021.06.25
블랙잭  (0) 2021.06.23
토마토  (0) 2021.06.19
소수 구하기 (에라토스테네스의 체)  (0) 2021.06.18
Odd Occurrences In Array  (0) 2021.06.18