백준 #2108 통계학(파이썬)

2022. 3. 11. 15:59백준 문제풀이

반응형

 

백준 2108 통계학 문제.(실버3)

 

이 문제를 소개하는 이유는 파이썬의 라이브러리인 statistics를 소개하기 위함이고, 

이와 동시에 '어떻게 문제를 풀 것인가' 에 나오는 문제를 풀이하는 방법을 적용해보기 위함이다.

 

 '어떻게 문제를 풀 것인가' 에서는 사고의 4가지 단계를 다음과 같이 소개하고 있다.

 

  1. 문제가 무엇인지 파악한다.(문제를 이해한다.) -> 미지인 것은 무엇인가? 자료는 무엇인가? 조건은 무엇인가?
  2. 연관 관계를 파악하고 계획을 수립한다.
  3. 계획을 실행한다.
  4. 회고한다.

 

그럼 위의 단계에 따라 문제를 해결해보자.


1. 문제파악

미지인 것은 산술 평균, 중앙값, 최빈값, 범위이다.

자료로 주어진 것은, n개의 수와, 주어질 수를 결정하는 n, 그리고 범위의 정의이다.

 

2. 계획 수립

산술 평균은 전체 값들의 합을 개수 n으로 나눈 값이다.

중앙값은 N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값이다.

최빈값은  N개의 수들 중 가장 많이 나타나는 값이다.

범위는 N개의 수들 중 최댓갑솨 최솟값의 차이이다.

 

산술 평균은 sum 함수를 이용해서 해결할 수 있다.

중앙값은 배열에서 길이 / 2의 인덱스의 값으로 구할 수 있다.

최빈값은 딕셔너리를 활용해서 해결할 수 있다.

범위는 정렬된 배열에서 끝 값과 첫 값을 빼서 구할 수 있다.

 

3. 계획 실행

 

위와 같이 계획을 실행해 보았고, 그 코드는 다음과 같다.

 

import sys

n = int(sys.stdin.readline())
arr = []
s = 0
for i in range(n):
    p = int(sys.stdin.readline())
    s += p
    arr.append(p)
print(round(s/n))

print(arr[int(len(arr)/2)])

freq = 0
for i in arr:
    if arr.count(i) > freq:
        freq = arr.count(i)
dic = {}
for i in set(arr):
    dic[i] = arr.count(i)
freqArr = []

a = list(dic.keys())

for i in a:
    if dic[i] == freq:
        freqArr.append(i)
if len(freqArr) == 1:
    print(freqArr[0])
else:
    print(list(sorted(freqArr))[1])
print(max(arr) - min(arr))

 

4. 회고

하지만 이 코드로는 시간초과가 발생해서 다시 문제를 해결해야하는 상황이 왔다..!!

 

그래서 여러 라이브러리를 찾아본 결과, 파이썬의 statistics를 발견했고, 이에 대해 소개하려 한다.

 

 

Python statistics


이 라이브러리는 numpy만큼 강력하다. 

라이브러리 이름에서 알 수 있듯이 통계와 관련된 라이브러리이다.

 

이 라이브러리는 다음과 같은 함수들을 제공한다.

 

source: https://docs.python.org/ko/dev/library/statistics.html

위에서 부터 살펴보면

mean 함수는 산술평균을 제공한다.

fmean은 부동소수점의 평균을 제공한다.

geometric_mean은 기하 평균을 제공한다.

harmonic_mean은 조화 평균을 제공한다.

median은 중앙값을 제공한다.

mode는 최빈값을 제공한다.

multimode는 최빈값들의 list를 제공한다.

 

그렇니까 우리가 필요한 모든 함수를 제공해주는 것이다!!!

 

그럼 위 함수들로 문제를 해결해보자.

 

import sys
import statistics as st

n = int(sys.stdin.readline())
arr = []
for i in range(n):
    arr.append(int(sys.stdin.readline()))

print(round(st.mean(arr)))
print(st.median(arr))
a = st.multimode(arr)
a.sort()
m = a[1] if len(a) > 1 else a[0]
print(m)
print(max(arr) - min(arr))

 

이렇게 간단한 코드가 나온다.

 

시간초과도 발생하지 않고, 쉽게 사용할 수 있다.

 

 

반응형