[백준/BOJ] 2108번 통계학

문제


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

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

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

입력


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

출력


첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

 

 

풀이 코드


import sys
from collections import Counter

n = int(sys.stdin.readline())
data = []
sumtemp = 0

for i in range(n):
 temp = int(sys.stdin.readline())
 data.append(temp)
 sumtemp += temp
print(round(sumtemp/n)) #print('%.0f'% (sumtemp/n))

#n이 1일때는 연산 안해도 됨
if n == 1:
  print(data[0])
  print(data[0])
  print(0)
  sys.exit()

#리스트 정렬
data = sorted(data)
print(data[n//2])

#사전 정렬
cnt = Counter(data)
cnt = sorted(cnt.items(),key=lambda x : (-x[1],x[0]))

#최빈값 출력
if cnt[0][1] == cnt[1][1]:
  print(cnt[1][0])
else:
  print(cnt[0][0])

#범위 출력
print(data[-1]-data[0])

결과 


풀이 결과

느낀점


최빈값을 구하는 게 제일 어려웠던 것 같다. 다른 값들은 조금만 생각하면 풀 수 있는 문제였고 산술평균을 구할 때 포맷팅을 쓰는 것보다 라운드 함수를 써서 푸는 게 시간 복잡도 면에서 더 나은 것 같아서 그렇게 풀었다. Counter를 통해서 dict형태로 값들을 받아와 내장 함수를 통해서 정렬 후 출력하는 것이 풀이었는데 아직 많이 부족해서 쉽게 풀이 방법이 생각나지 않았다. Counter에 대해서 공부해봐야겠다. 

앞으로 BOJ 나 프로그래머스에서 푸는 문제들은 깃허브와 블로그에 같이 올릴 예정이다. 조금씩 성장하는 모습을 지켜봐주시길!

 

'Algorithm' 카테고리의 다른 글

[BOJ/백준] 10816 숫자 카드 2  (0) 2020.11.19
[BOJ/백준]1920번 수 찾기  (0) 2020.11.17
[이코테]순차탐색과 이진탐색  (0) 2020.11.17
[이코테]계수정렬  (0) 2020.11.16
[이코테]정렬알고리즘의 개요  (0) 2020.11.15
<