오늘의 문제
https://www.acmicpc.net/problem/2108
다른 것은 어렵지 않으나 최빈값을 구하는 것으로 제일 고민되었던 문제였다.
포인트 쳌쳌
- 산술평균은 총 합계를 구한 후 정수의 개수(n)으로 나눈다.
- 중앙값은 오름차순 정렬 후 중앙에 위차한 인덱스로 접근한다.
- 최빈값 은 Counter클래스를 사용해보았다.
- 범위 는 2번에서 이미 정렬되었으므로 단순히 최대값(max함수 사용)에서 최소값(min함수 사용)을 빼준다.
Counter.most_common() 사용하기
먼저, Counter쿨래스란 파이썬 Collections 모듈이 제공하는 편리하고 빠른 집계를 지원하기 위한 도구이다. 딕셔너리 개체를 계산하기 위한 하위 클래스로서 키값(key)에 요소가 저장되고, 그 요소의 개수가 해당 키의 값(value)으로 저장되는 컬렉션.
객체 생성시에는 문자열, 리스트, 딕셔너리 모두 이용될 수 있다.
c = Counter()
c = Counter('gimsubin')
c = Counter({'red': 4, 'blue': 2})
c = Counter(['eggs', 'ham'])
몇개의 메소드들이 있지만 이 문제에서 다룬 메소드 most_common 정리하겠다.
Counter에 대한 더 많은 정보는 참고문서를 확인해주세요!
most_common([n])
매개변수 n 없이 most_common() 형태로 사용한다면,
모든 (원소 ,그 원소의 빈도값)
튜플 쌍울 원소의 내림차순대로 반환해준다.
c = Counter('ggeeeegooooooooodaab').most_common()
print(c)
#출력: [('o', 9), ('e', 4), ('g', 3), ('a', 2), ('d', 1), ('b', 1)]
n을 써준다면 n개의 원소튜플 쌍들을 내림차순으로 반환한다.
c = Counter('ggeeeegooooooooodaab').most_common(2)
print(c)
#출력: [('o', 9), ('e', 4)]
아래는 채점에 통과한 코드이다.
풀이 코드
import sys
from collections import Counter
n = int(sys.stdin.readline()) #입력: 홀수인 정수 최소 1개, 최대 50만개
num = [] #정수 리스트
sum = 0
#총 합계 구하기
for i in range(n):
now = int(sys.stdin.readline()) #-4000 < now < 4000
num.append(now)
sum += now
#중앙값 찾기
num.sort()
if len(num) % 2 == 0:
mid = len(num) // 2 - 1
else:
mid = len(num) // 2
#최빈값 찾기
fre = 0
cnt = Counter(num).most_common()
if len(cnt) != 1:
if cnt[0][1] == cnt[1][1]:
fre = cnt[1][0]
else:
fre = cnt[0][0]
else:
fre = cnt[0][0]
#범위 찾기
size = max(num)-min(num)
#결과 출력
sys.stdout.write('{}\n{}\n{}\n{}\n'.format(round(sum/n), num[mid], fre, size))