백준 알고리즘 | 2108번 - 통계학

유하연·2021년 7월 10일
0

BOJ

목록 보기
7/9

✏️ 문제



📝 문제 풀이

산술평균, 중앙값, 범위는 파이썬 내장 함수를 이용하여 쉽게 구할 수 있었는데 최빈값 구하는 방법을 알아야 했다.
처음에 dict를 써보려고 했으니 시간복잡도 측면에서 그닥 좋은 방법이 아닌 알고리즘을 떠올렸기 때문에 다른 방법을 생각했다.

처음 생각한 방법은 set를 이용해 중복값을 제거한 리스트를 새로 만들어서 구하는 방법이었다. 이 방법은 최빈값은 쉽게 구할 수 있었지만 조건중 하나인 '최빈값이 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.'를 만족하기 힘들었다.

검색해보다가 collections로 최빈값 구하는 방법을 알게 되었다. 생각했던 것 중 가장 구현도 깔끔하고 쉽게 구할 수 있을 것 같았다. 하지만 IndexError가 발생했다...

왜인가 싶어서 리스트의 길이가 1인 값을 입력으로 해봤는데 이게 문제였던 것이었다. 비교할 mdoe[1][0]가 없었기 때문에 에러가 발생했던 것이다. 결국 리스트의 길이가 1인 것도 다시 처리를 해주었고, 성공할 수 있었다.


👩🏻‍💻 소스 코드

import sys
from collections import Counter

# 입력 받기
n = int(sys.stdin.readline().rstrip())
num = [int(sys.stdin.readline().rstrip()) for i in range(n)]

# 최빈값 처리
mode = Counter(sorted(num)).most_common(2)
if len(mode) == 1 or mode[0][1] != mode[1][1]:
    many = mode[0][0]
else: many = mode[1][0]

sys.stdout.write(str(round(sum(num)/n))+'\n')
sys.stdout.write(str(sorted(num)[n//2])+'\n')
sys.stdout.write(str(many)+'\n')
sys.stdout.write(str(max(num)-min(num))+'\n')
profile
https://yuhalog.tistory.com/

0개의 댓글

관련 채용 정보