[알각코] 백준 2108번 - 통계학

백준 2108번

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

num = int(input())

numList = []
mList = []
for i in range(num):
  numList.append(input())

mDict = {}
vList = [x in range(-4000, 4001)]

for i in range(8000):
  
sorted(numList)

avg = sum(numList) // num
md = numList[num // 2]
# 최빈값
cnt = 

최빈값을 구하기 위해 어떻게 해야할지 생각해보았다

  1. 80000개의 원소를 가지고 있는 리스트를 생성해서 나온수만큼 카운팅을 한다 -> 이렇게 하려면 8000개의 리스트를 매번 input 값이 들어올때마다 equal 체크를 해야하므로 시간이 너무 오래걸린다 ㅠㅠㅠ

  2. python 모듈을 쓴다 -> 내가 잘 모른당..

from collections import Counter

num = int(input())

numList = []
mList = []
for i in range(num):
  numList.append(int(input()))

sorted(numList)

# 평균값
print(sum(numList) // num)
# 중앙값
print(numList[num // 2])
# 최빈값
cnt = Counter(numList).most_common(2)
if len(cnt) > 1: 
  if cnt[0][1] == cnt[1][1]: 
    print(cnt[1][0]) 
  else: print(cnt[0][0]) 
else: print(cnt[0][0])

# 최대값 - 최소값
print(max(numList) - min(numList))

Screen Shot 2021-09-02 at 12 23 15 AM

그래서 collections 모듈 공부를 해보았다

collections엔 다양한 함수들이 있는데, 그중 Counter 클래스는 리스트를 받는데 그 리스트 안의 동일한 값의 개수를 세어주는 함수이다.

그 중 Counter 클래수 안의 most_common 메소드는 가장 동일개수가 높은 값을 출력해주는데, 안에 숫자를 받는다.

그 숫자는 몇 번째로 동일한 값이 많은지를 봐주는 값이다.

그래서 위 문제에서 최빈값은 가장 동일한 값이 많은 값을 출력하되, 동일값이 높은 개수도 또한 동일할때, 두 번째로 작은 값을 출력하도록 한다.

위 most_commons 메소드로 2를 주면, 가장 동일한 값이 많은 아이를 출력해주되, 여러개면, 그중 작은 값부터 두 개를 출력하게 된다. 그렇게 if문으로 판별하여 print함

그런데 오잉 왜 틀렸지!!!

from collections import Counter

num = int(input())

numList = []
for i in range(num):
  numList.append(int(input()))
sList = sorted(numList)

# 평균값
print(sum(sList) // num)
# 중앙값
print(sList[num//2])
# 최빈값
cnt = Counter(sList).most_common(2)
if num > 1: 
  if cnt[0][1] == cnt[1][1]: 
    print(cnt[1][0]) 
  else: print(cnt[0][0]) 
else: print(cnt[0][0])

# 최대값 - 최소값
print(max(sList) - min(sList))

sorted함수 적용한 리스트를 다시 받아줘서 쓰니 해결!

Screen Shot 2021-09-02 at 3 25 13 PM

으악 이제 그만

import sys
from collections import Counter

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

numList = []
for i in range(num):
  numList.append(int(sys.stdin.readline()))
sList = sorted(numList)

# 평균값
print(sum(sList) // num)
# 중앙값
print(sList[num//2])
# 최빈값
cnt = Counter(sList).most_common(2)
if num > 1: 
  if cnt[0][1] == cnt[1][1]: 
    print(cnt[1][0]) 
  else: print(cnt[0][0]) 
else: print(cnt[0][0])

# 최대값 - 최소값
print(max(sList) - min(sList))

Screen Shot 2021-09-02 at 3 31 34 PM

뭔데 대체… 짜증 보기로는 다 맞았는데여…

++ 근데.. 이거 이후로 다시 볼일이 있을까 ㅎㅎㅎ

Reference