[algorithm] 백준 2108 - 통계학
안녕하세요. 심심한 코딩쟁이입니다.
오늘은 백준 2108번 문제 - 통계학 의 풀이를 살펴보도록 하겠습니다.
풀이에 사용한 언어는 Python3 입니다.
문제 해석과 풀이 다 함께 살펴보시죠.
백준 BAEKJOON 2108
반응형
문제 해석
통계학에서 여러 수를 대표하는 통계값 중 산술평균, 중앙값, 최빈값, 범위를 구해서 출력해 주는 문제입니다.
N개의 숫자가 입력값으로 주어지며 무조건 홀수개이다.
그리고 최빈값이 여러 개일 경우에는 그중에서 두 번째로 작은 수를 출력해주어야 한다.
우리가 기본적으로 알고 있는 상식으로도 충분히 풀 수 있는 문제이다.
풀이
# 2108 통계학
import sys
from collections import Counter
N = int(sys.stdin.readline())
num_list = [int(sys.stdin.readline()) for i in range(N)]
num_list.sort()
print(round(sum(num_list)/N))
print(num_list[N//2])
if N != 1 :
cnt = Counter(num_list).most_common(2)
print(cnt[1][0]) if cnt[0][1] == cnt[1][1] else print(cnt[0][0])
else :
print(num_list[0])
print(max(num_list)-min(num_list))
풀이 해석 및 팁
이번 문제에서 특별히 신경 써야 할 점으로는 우선 입력값을 받아올 때 input()을 사용하면 시간초과를 받게 됩니다.
따라서 import sys를 해주고 sys.stdin.readline()을 통해 입력값을 받아오도록 코드를 작성했습니다.
평균값으로는 소수점 첫 째 자리에서 반올림을 해주어야 하므로 단순하게 round()를 사용하고
중앙값을 출력할 때는 N은 무조건 홀수라는 조건이 달려있기에 N//2를 해주어서 인덱스로 사용하면 됩니다.
최빈값에서 조금 막막했을 수도 있지만 우리에게는 유용한 라이브러리들이 있기에 잘 활용해 줍시다.
collections의 Counter를 사용해서 리스트 요소의 개수를 체크합니다.
여기서 most_common(2)를 붙여주면 빈도수가 높은 숫자 중 앞에서 2개를 반환해 줍니다.
위 과정 없이 Counter(num_list) 만을 사용하면 빈도가 많은 순을 우선으로 하며 요소의 크기가 오름차순으로
정렬된 상태의 리스트가 반환됩니다.
우리가 필요한 건 두 번째로 작은 수 까지기에 most_common(2)을 뒤에 붙여주도록 합니다.
마지막으로 범위는 최댓값에서 최솟값을 뺀 값을 출력하면 됩니다.
여기까지 백준 2108번 통계학 문제 풀이였습니다.
이번 문제의 정답률은 25% 정도입니다.
아마도 최빈값을 출력하는 부분에서 같은 빈도가 존재하면 두 번째로 작은 수를 입력하라는 조건을
제대로 읽지 않았거나 빈도값을 계산하는 부분에서 실수가 발생했을 것으로 보입니다.
헷갈리는 부분이 있으시면 댓글로 남겨주시기 바랍니다.
감사합니다.
반응형
'programming > algorithm' 카테고리의 다른 글
[algorithm] 백준 27433 - 팩토리얼 2 (0) | 2023.04.30 |
---|---|
[algorithm] 백준 20920 - 영단어 암기는 괴로워 (0) | 2023.04.29 |
[algorithm] 백준 26069 - 붙임성 좋은 총총이 (0) | 2023.04.27 |
[algorithm] 백준 25192 - 인사성 밝은 곰곰이 (0) | 2023.04.26 |
[algorithm] 백준 1037 - 약수 (0) | 2023.04.25 |