[BOJ] 2108번: 통계학 (Python)

seulzzang·2022년 10월 25일
0

코딩테스트 연습

목록 보기
34/44
post-thumbnail

📍 문제

[BOJ] 2108번: 통계학

📍 풀이

  • 나머지 통계값들은 출력하는데 별 무리가 없었다. 최빈값은 Collections 모듈의 Counter 클래스를 이용해 출력하도록 했다.
from collections import Counter
import sys

N = int(sys.stdin.readline())
nums = []
for _ in range(N):
    nums.append(int(sys.stdin.readline()))

nums.sort()
print(round(sum(nums)/N))
print(nums[N//2])

# 최빈값 중 두 번째로 작은 값을 출력한다.
nums_mode = Counter(nums).most_common()
if len(nums_mode) > 1:
    if nums_mode[0][1] == nums_mode[1][1]:
        print(nums_mode[1][0])
    else:
        print(nums_mode[0][0])
else:
    print(nums_mode[0][0])

print(max(nums)-min(nums))
# print(nums[-1] - nums[0])

최빈값 구하기(most_common())

  • collections.Counter(a).most_common() : a의 요소를 세어, 최빈값을 리스트에 담긴 튜플 형태로 반환한다.

문제에서의 예제 입력을 이용해 예를 들자면, 입력이 다음과 같을 때

5
1
3
8
-2
2

most_common()을 사용하면

nums_mode = Counter(nums).most_common()
nums_mode
[(-2, 1), (1, 1), (2, 1), (3, 1), (8, 1)]

nums리스트에는 [1, 3, 8, -2, 2]가 담겨있으므로 각 수의 등장횟수인 1이 튜플 형태로 짝지어서 저장이 된다.
nums_mode[0][0]의 출력값은 -2가되고, nums_mode[0][1]의 출력값은 1이 된다.

우리가 필요한 것은 최빈값 이므로 등장빈도 횟수를 비교해서, 그 횟수가 가장 큰 수를 출력해 주면 된다.

  • BOJ문제에는 셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.라는 조건이 있으므로 if문에 해당하는 조건을 넣어준다. 등장빈도가 동일한 수가 있다면, 두 번째로 작은 값을 출력해주고, 아니라면 그냥 제일 첫번째 원소에 해당하는 수를 출력해주면 된다.
profile
중요한 것은 꺾이지 않는 마음

0개의 댓글