본문 바로가기

알고리즘/python

[python/파이썬] 백준 2108 통계학

반응형

[문제 출처]

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

 

2108번: 통계학

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

www.acmicpc.net

 

[문제 풀이]

주어진 n개의 숫자에 대해서 

산술평균, 중앙값, 최빈값, 범위를 구하는 문제이다.

 

산술평균의 경우 문제에서 소수점 이하 첫째 자리에서 반올림한 값을 출력한다고 제시되어있으므로 round()를 사용하였다.

 

중앙값과 범위는 n개의 숫자들이 저장된 리스트를 오름차순으로 정렬하면 쉽게 구할 수 있다.

 

최빈값을 구하는 것은 collections모듈의 Counter 클래스를 사용하면 쉽지만 직접 구해보았다.

딕셔너리를 이용해서 해당 숫자를 key로 그 숫자의 빈도수를 value로 하여 저장하였고, 

최빈값을 구하기 위해서 value 기준 오름차순으로 정렬해주었다.

여기에서 주의할 점은 정렬한 결과는 딕셔너리가 아니라 리스트로 타입이 바뀌기 때문에

key, value로 접근하지 못하고 0번째 key와 value에 접근하기 위해서는 count[0][0], count[0][1]를 사용해야 한다.

 

 

#2108
import sys

input = sys.stdin.readline
n = int(input())

numbers = []
for i in range(n):
  numbers.append(int(input()))
numbers.sort()

count = {}
for i in range(n):
  if numbers[i] in count.keys():
    count[numbers[i]] += 1
  else:
    count[numbers[i]] = 1

count = sorted(count.items(), key = lambda x:x[1], reverse=True)   

print(round(sum(numbers)/n))
print(numbers[len(numbers)//2])
if len(count)==1 or count[0][1]!=count[1][1]:
  print(count[0][0])
else:
  print(count[1][0])
  
print(numbers[-1] - numbers[0])
반응형