minimimi

[백준] 2108 통계학 본문

프로그래밍 공부/알고리즘

[백준] 2108 통계학

99mini 2021. 9. 20. 18:00
반응형

문제출처] https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net


문제요약

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

풀이

산술평균

소수점 이하 첫 째 자리에서 반올림하기 위해 round() 를 이용한다.

average = int(round((sum(datas)/n)))

round(number,n)은 소수점 n번 째 자리까지 반올림을 수행한다.


중앙값

데이터를 정렬한 후 데이터의 길이 ÷ 2 를 인덱스로 하는 값을 갖는다.

datas.sort()
center = datas[n//2]

최빈값

### 최빈값 ###

# Counter(iterable)는 
# iterable의 요소의 개수를 딕셔너리로 저장하는 Counter class 반환
mode_dict = Counter(datas)

# mode_dict.most_common()는
# 딕셔너리의 value값을 기준으로 오름차순 정렬 
# list로 반환
modes = mode_dict.most_common()
key = modes[0][1]
d = []
i = 0

# 배열을 빈도수도 정렬하여 빈도수의 최대값보다 작아지면
# while문을 벗어난다.
while(i != len(modes) and (modes[i][1] == key)):
    d.append(modes[i][0])
    i += 1

d.sort()

if len(d)==1:
    print(d[0]) 
else:
    print(d[1])

범위

데이터의 최대값에서 최소값을 빼주면 범위가 나온다.

### 범위 ###
length = max(datas) - min(datas)
print(length)

소스코드는 Python 3으로 작성되었습니다.

import sys
from collections import Counter
input = sys.stdin.readline

datas = []

n = int(input())
for i in range(n):
  datas.append(int(input()))

### 산술평균 ###
average = int(round((sum(datas)/n)))
print(average)

### 중앙값 ###
datas.sort()
center = datas[n//2]
print(center)

### 최빈값 ###

# Counter(iterable)는 
# iterable의 요소의 개수를 딕셔너리로 저장하는 Counter class 반환
mode_dict = Counter(datas)

# mode_dict.most_common()는
# 딕셔너리의 value값을 기준으로 오름차순 정렬 
# list로 반환
modes = mode_dict.most_common()
key = modes[0][1]
d = []
i = 0

# 배열을 빈도수도 정렬하여 빈도수의 최대값보다 작아지면
# while문을 벗어난다.
while(i != len(modes) and (modes[i][1] == key)):
    d.append(modes[i][0])
    i += 1

d.sort()

if len(d)==1:
    print(d[0]) 
else:
    print(d[1])

### 범위 ###
length = max(datas) - min(datas)
print(length)
반응형