코팅테스트/백준 문제 모음
백준 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