For Programmer

백준 2108번 파이썬 문제풀이(통계학) 본문

코팅테스트/백준 문제 모음

백준 2108번 파이썬 문제풀이(통계학)

유지광이 2022. 2. 22. 17:01
728x90


조금 귀찮은 구현이다. 특히 최빈값 구하는게 가장 귀찮다. 나는 계수정렬에서 사용하는 방식인 미리 count 리스트를 8000개 만들어 놓고 개수를 추가해서 최대 개수가 있는 인덱스를 찾는 방식으로 하였다.

 

import sys

# 입력 빠르게 받기
input = sys.stdin.readline

N = int(input())
sum_ = 0  # 합계저장

middle = 0
count_list = [0] * 8001
mode = 0
arr = []
for i in range(N):
    temp = int(input())

    # 전체합
    sum_ += temp

    # 입력받은 값을 리스트에 추가
    arr.append(temp)

    # 최빈값 구하기 위해 count 저장(음수도 저장하기 위해 4000씩 밀어주고 출력할때 빼준다.)
    count_list[temp + 4000] += 1

arr.sort()  # 정렬

# 최빈값 구하기
# 만약 최빈값이 두개이상이라면
if count_list.count(max(count_list)) > 1:
    mode_index = count_list.index(max(count_list))  # 첫번째 최빈값의 인덱스를 저장한 후
    # 첫번째 인덱스 이후에 있는 최빈값을 반환한다.
    mode = (count_list.index(max(count_list), mode_index + 1)) - 4000
# 만약 최빈값이 하나라면
else:
    mode = count_list.index(max(count_list)) - 4000  # 해당 최빈값을 추가

# 산술평균 구하기
# 만약 합계를 나눈 값이 -0.xxx 가나온다면
if -1 < sum_ / N <= 0:
    result = 0  # 해당 값을 0으로 바꿔준다.(-0으로 나오는 것을 방지)
else:  # 나머지 경우는 반올림 해준다.
    result = round(sum_ / N, 0)

print(f'{result :.0f}')  # 산술평균 출력
print(arr[N // 2])  # 중앙값 출력
print(mode)  # 최빈값 출력
print(arr[-1] - arr[0])  # 범위출력
728x90
Comments