[Python] BOJ 2108 - 통계학

728x90
반응형

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

어렵진 않지만 소문제 4개로 나누어져 있고 정리할게 많아서 정리해본다.

 

import sys, collections
input = sys.stdin.readline
numList = []
T = int(input())
for _ in range(T):
    n = int(input())
    numList.append(n)
numList.sort()

print(round(sum(numList)/T))
print(numList[int(T/2)])

colList = collections.Counter(numList)
a = colList.most_common(1)[0][1]
mList = []
for i in colList.most_common():
    if(i[1] == a):
        mList.append(i[0])
if(len(mList) == 1):
    print(mList[0])
else:
    print(mList[1])

print(max(numList) - min(numList))

4줄에 걸쳐 산술평균, 중앙값, 최빈값, 범위를 출력해야 하는 문제이다.

 

* 처음에 수들을 입력받아 numList 배열에 넣고 numList.sort()로 오름차순으로 정렬했다.

(내장함수 sort는 O(nlogn)인듯, O(N^2)이 있으면 이 문제는 시간초과가 뜬다)

 

1. 산술평균은 그냥 numList의 숫자들을 더해서 numList의 len으로 나누어주면 된다. 문제에서 소수점 이하 첫째 자리에서 반올림 하라했으므로 round함수를 썼다.

반올림 이야기가 나와서 그러는데, Python에서 반올림함수인 round함수는 '오사오입'을 따른다. 

  * '오사오입'이란?

출처 : 위키피디아

따라서 round(2.5)를 출력하면 3이 아니라 2가 출력된다. 따라서 우리가 알고 있는 반올림을 하려면 아래와 같은 방법을 써야한다.

https://m.blog.naver.com/PostView.nhn?blogId=herbdoc95&logNo=221574077380&categoryNo=31&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

파이썬 round() 반올림 사용 시 주의점

파이썬에서는 math 라이브러리를 import 하지 않아도 round 함수를 사용할 수 있네요. 오홋~!반올림에는 여...

blog.naver.com

하지만, 이 문제에서는 처음 입력하는 숫자가 홀수개이므로 숫자들의 합이 .5로 끝날 일이 없으므로 그냥

round함수를 사용했다.

 

  2. 중앙값은 오름차순으로 정렬한 뒤 중앙에 위치하는 값이다. 따라서 numList의 중앙 인덱스인 T/2를 한 뒤 버리는 방식을 썼다.

 

  3. 최빈값은 numList숫자들 중 가장 많이 나타나는 값인데, 최빈값이 여러개일 경우 최빈값 중 두번째로 작은 값을 출력하라고 되어있다. 여기서 시간이 조금 걸렸는데, 저번에 python 모듈을 찾아보다 정리한counter 메소드가 생각났다. 

  * counter메소드

  L에 1,1,3,2를 넣고 M을 출력하면 다음과 같이 출력된다.

1이 2개, 3이 1개, 2개 1개 있다는 뜻

여기서 M.most_common()을 출력하면 

이렇게 튜플형태로 리스트에 담아 출력해준다. 

 

처음에 a에 colList.most_common(1)[0][1] 값(가장 많이 등장하는 숫자의 등장횟수)을 저장했다.

그리고 for문을 돌며 숫자들의 등장횟수가 a와 같은지 비교해서 같으면 mList에 넣었다.

최종적으로 mList의 len이 1이면 최빈값이 하나이므로 그걸 출력하고, 아니면 2개이상이므로 mList의

두 번째로 가장 작은수인 1번째 인덱스 값(이미 맨위에서 오름차순으로 정렬했으므로)을 출력해준다.

 

  4. 범위는 그냥 max값에서 min값을 빼주면 된다.

728x90
반응형
TAGS.

Comments