[백준] 2108번 - 통계학

1. 통계학

A. 문제

위 백준 사이트에 접속하여 문제를 확인해주세요.

B. 내 답안


n = int(input())  
  
array = []  
  
for i in range(n):  
    array.append(int(input()))  
  
avg = sum(array)/len(array)  
avg = int(round(avg, 0))  
mid = sorted(array)[len(array)//2]  
  
count_sort = {}  
  
for i in array:  
    if i in count_sort:  
        count_sort[i] += 1  
    else:  
        count_sort[i] = 1  
  
max_count = sorted(count_sort.items(), key=lambda i:i[1], reverse=True)  
# print(max_count)  
# for key, value in count_sort.items():  
mode_count = [x[0] for x in max_count if x[1] == max_count[0][1]]  
if len(mode_count) > 1:  
    mode_count = sorted(mode_count)[1]  
else:  
    mode_count = mode_count[0]  
# bin =  
scope = max(array) - min(array)  
  
print(avg)  
print(mid)  
print(mode_count)  
print(scope)

a. 회고

내 풀이

  • 특정 문자의 빈도를 구하는 방법으로 문자열은 count 메소드가 있지만, list는 Counter 모듈을 사용해야 한다.
  • 값의 범위가 -4000 ~ 4000 이라서 리스트를 사용한 계수 정렬은 불가능하다.
    • 물론 값에 4000을 더해서 생각한다면, 계수 정렬도 가능하다.
  • 그래서 딕셔너리를 통해 빈도를 카운트했다.

반성

  • 값에 4000을 더해서 무조건 양수로 만드는 방법을 생각하지 못했다.

결론

  • 세상은 넓다. 실력자도 많다. 문제를 풀어갈수록 모르는 것 투성이다.

C. 문제 해설

이해한 내용을 바탕으로 작성했습니다.

셋째 줄에 출력하는 최빈값이 문제다.
최빈값을 구하려면 값의 빈도를 알아야 한다. 값의 빈도는 딕셔너리에 해당 key값이 있으면 value를 증가시키는 방법으로 구할 수 있다.

딕셔너리에 값을 다 넣었다면, 최빈값을 구해야 한다. 최빈값은 딕셔너리의 value를 기준으로 정렬시켜서 구할 수 있다.

이때, 최빈값이 여러개일 수도 있으니, value를 기준으로 정렬한 리스트의 첫번째 빈도값과 같은 경우만 따로 리스트를 만들어준다. 그리고 출력할때는 이 리스트를 오름차순으로 정렬하고 두번째 값을 출력하면 된다.

참고문헌

2108번: 통계학 (acmicpc.net). Baekjoon. (accessed Sep 10, 2021)

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.