코딩일지/python 백준 알고리즘

python 백준 알고리즘 2108번: 통계학

야언 2022. 9. 20. 18:50

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

산술평균 - round(sum(nums) / n)

 

중앙값 - sort 혹은 sorted 정렬 후, 정중앙 수 nums[int((n - 1) / 2)]

 

**  최빈값 

첫 구상 - 딕셔너리 생성 후 정수들 append 해서 가장 많은 밸류 찾기

 

구글링을 했더니 collection 모듈의 Counter 함수를 사용해 빈도수를 구하는 방법이 있었다.

출력 조건중 최빈값이 여러 개 있을 때에는 그중 두 번째로 작은 값을 출력하기 위해 조건문.

최빈값은 몇개가 됐던 두번째만 출력하면 되니까

mode = Counter(nums).most_common()  # 빈도수 오름차순 정렬
mode_value = 0

if mode[0][1] == mode[1][1]:  # 최빈값을 가지는 수가 두개 이상인 경우
    mode_value = mode[1][0]  # 두번째로 작은 수 출력
else:  # 최빈값을 가지는 수가 하나인 경우
    mode_value = mode[0][0]  # 그대로 출력

이런식으로 정리해보았는데 인덱스 에러가 발생했다.. 왜그러지

 

수정본

mode = Counter(nums).most_common()  # 빈도수 오름차순 정렬
mode_value = 0

if len(mode) == 1:  # 최빈값을 가지는 수가 한개일경우
    mode_value = mode[0][0]  # 그대로 첫번째 값이 최빈값
elif mode[0][1] == mode[1][1]:  #  최빈값을 가지는 수가 두개 이상인 경우
    mode_value = mode[1][0]  #  두번째로 작은 수 출력
else:
    mode_value = mode[0][0]

 

범위 - (최댓값 - 최솟값) = (max(nums) - min(nums)), 혹은 오름차순 정렬을 시행했으므로 (nums[-1] - nums[0])

 

 

 

내 제출

import sys
from collections import Counter

n = int(sys.stdin.readline())

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

# 산술평균
print(round(sum(nums) / n))

# 중앙값
nums.sort()
print(nums[int((n - 1) / 2)])

# 최빈값
mode = Counter(nums).most_common()  # 빈도수 오름차순 정렬
mode_value = 0

if len(mode) == 1:  # 최빈값을 가지는 수가 한개일경우
    mode_value = mode[0][0]  # 그대로 첫번째 값이 최빈값
elif mode[0][1] == mode[1][1]:  #  최빈값을 가지는 수가 두개 이상인 경우
    mode_value = mode[1][0]  #  두번째로 작은 수 출력
else:
    mode_value = mode[0][0]

print(mode_value)

# 범위
print(nums[-1] - nums[0])