# [백준] 2108번 - 통계학

- Author: @mildsalmon
- Published: 2021-09-09
- Updated: 2021-09-09
- Source: http://blex.me/@mildsalmon/%EB%B0%B1%EC%A4%80-2108%EB%B2%88-%ED%86%B5%EA%B3%84%ED%95%99
- Tags: 파이썬, 알고리즘, 코딩테스트, 문제, 구현, 정렬, 백준

---

# 1. 통계학

- 난이도
	-  실버 4
- 시간 제한
	- 2초
- 메모리 제한
	- 256 MB
- 출처
	- [2108번: 통계학 (acmicpc.net)](https://www.acmicpc.net/problem/2108)

### A. 문제

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

### B. 내 답안

```python

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)](https://www.acmicpc.net/problem/2108). Baekjoon. (accessed Sep 10, 2021)
