N개의 수가 주어질 때 산술평균, 중앙값, 최빈값, 범위를 출력하는 문제다.
최빈값이 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
평균은 sum 함수를 사용 후 round로 반올림해 해결했다.
중앙값은 배열을 정렬 후 가운데 인덱스를 출력했다.
범위는 min, max 값을 구해 해결했다.
이 문제의 핵심인 최빈값은 Counter 클래스를 사용해 해결했다!!
import sys
from collections import Counter
def modefinder(arr):
c = Counter(arr) #빈도를 저장
order = c.most_common() #빈도 기준으로 내림차순으로 정렬
maximum = order[0][1] #최대 빈도수를 maximum에 저장
modes = [] #새로운 리스트
for num in order:
if num[1] == maximum: #최빈값을 리스트에 추가
modes.append(num[0])
if len(modes) == 1: #최빈값이 하나면 그냥 출력
return modes[0]
else: #최빈값이 2개 이상이면 두 번째 값 출력
return modes[1]
n = int(sys.stdin.readline())
arr = []
for i in range(n):
arr.append(int(sys.stdin.readline()))
avg = sum(arr) / n
print(round(avg))
arr = sorted(arr)
print(arr[n//2])
most = modefinder(arr)
print(most)
print(max(arr) - min(arr))
Counter는 사전(dict) 클래스의 하위 클래스로 리스트나 튜플에서 각 데이터가 등장한 횟수를 사전 형식으로 돌려준다.
from collections import Counter
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
cnt = Counter(colors)
#cnt 출력 결과
Counter({'blue': 3, 'red': 2, 'green': 1})
등장한 횟수를 내림차순으로 정리해준다.
from collections import Counter
numbers = [1, 2, 3, 3, 4, 4, 4, 5, 5]
cnt = Counter(numbers)
cnt.most_common()
#출력 결과
[(4, 3), (3, 2), (5, 2), (1, 1), (2, 1)]
최빈값 때문에 c언어로 풀 때는 포기했었던 문제다.
파이썬으로 풀면서 새로운 지식도 얻고 푸는 것도 성공하니 좋은 느낌? (ノ◕ヮ◕)ノ*:・゚✧