본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 2108번 통계학(with python)

by 윤무무 2023. 2. 2.

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

 

2108번: 통계학

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

www.acmicpc.net

 

1. 내가 작성한 풀이
from collections import Counter
import sys

n = int(sys.stdin.readline())
arr = []

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

arr = sorted(arr)

#산술평균
print(int(round(sum(arr)/n,0)))

#중앙값
print(arr[n//2])

#최빈값
cnt = Counter(arr)
value = cnt.most_common()
maxium = value[0][1]
mods = []

for num in value:
  if num[1] == maxium:
    mods.append(num[0])

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


#범위
print(max(arr) - min(arr))

 

1. 산술평균

print(int(round(sum(arr)/n,0)))

 

round라는 함수를 잘 몰라서, round(숫자,0)으로 했더니 실수 형태로 출력이 됐다.

 

이걸 int 함수로 감싸서 출력했는데

 

그냥 round(sum(arr)/n)을 하면 알아서 반올림되어 출력한다.

 

 

2. 중앙값

print(arr[n//2])

 

index를 이용해서 구하면 간단하게 구할 수 잇다 (숫자의 개수가 홀수라고 정해져있음)

 

 

3. 최빈값

이 문제에서 가장 어려운 부분이다.

 

우선 Counter(리스트명).most_common() 함수란 데이터의 개수가 많은 순으로 정렬된 배열을 리턴하는 함수이다.

 

arr = [1,3,8,-2,2]

cnt = Counter(arr).most_common()
#값이 많은 것부터 순서대로 출력 됨
#[(1, 1), (3, 1), (8, 1), (-2, 1), (2, 1)]

 

본 문제에서 최빈값이 여러 개가 있을 경우 두 번째로 작은 값을 출력해야 하기 때문에

 

maximum = cnt[0][1] #1
mods = []

for i in cnt:
  if maximum == i[1]:
      mods.append(i[0])

print(mods[1])

새로운 배열에 maximum과 같은 값을 가진 key들을 넣어주고, index가 1인 수를 출력하주면 두 번째로 작은 값이 출력된다.

cnt = Counter(arr)
value = cnt.most_common()
maxium = value[0][1]
mods = []

for num in value:
  if num[1] == maxium:
    mods.append(num[0])

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

최빈값이 1개인 경우를 생각해서 조건부로 걸어주면 문제를 풀 수 있다.

 

Counter 함수를 잘 이해하고 있으면 해결할 수 있는 문제였다. 

 

 

4. 범위

print(max(arr) - min(arr))

 

범위도 그냥 원소의 최대값에서 원소의 최소값을 빼면 된다.

 

 

 

input() 함수를 사용하면 시간초과가 발생하기 때문에 sys.stdin.readline() 까지 사용하면 끝!

댓글