상세 컨텐츠

본문 제목

[백준] 2108번 - 통계학 (정렬) - 결과 포함

개발 공부 (알고리즘)

by letprogramming 2021. 2. 2. 01:43

본문

반응형

www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

숫자를 입력 받아 4가지의 결과를 출력해야 하는 문제였다.

정렬도 중요하지만 출력을 할 때 값을 어떻게 포맷할지도 중요한 문제였다.

 

1. 산술평균

산술평균은 리스트의 모든 값을 더한 후 갯수로 나눈 값이다.

(a + b + c + ... ) / n 으로 나타낼 수 있다.

단순하게 입력 받은 수들을 모두 더하고 나눠주면 되지만,

출력 조건이 소수점 이하 첫째 자리에서 반올림한 값이었다.

 

파이썬에는 round()라는 반올림 함수가 기본 내장 함수로 들어있어서 편리했다.

 

2. 중앙값

중앙값은 모든 숫자를 오름차순으로 정렬했을 때 가운데에 위치한 값이다.

문제에서 전체 입력받는 숫자의 갯수는 홀수라고 한정지었다.

 

아마 이 중앙값을 구하기 위해서 조건을 정했다고 생각한다.

만약 [1, 2, 3, 4, 5]가 있다면 이 리스트에서 중앙값은 3이다.

 

전체 숫자의 갯수인 N을 2로 나눈 값을 math.floor()를 이용해 소수점 밑을 버렸다.

python3에서는 정수끼리 나누었을 때 소수가 나오면 버리는 것이 아니라 실제로 소수가 변수에 대입되기 때문에 버림을 해주었다.

 

3. 최빈값

최빈값은 최대 빈도로 나타나는 값이라고 할 수 있다.

중복되는 횟수가 가장 많은 값을 출력하는 것이다.

계수 정렬때 한 것처럼 입력받은 수들의 횟수를 센 리스트를 만들어서 해결했다.

 

주의할 점은 문제의 입력은 절댓값이 4000을 넘지 않으므로 음수가 될 수 있다.

즉, 입력 가능한 수의 범위는  -4000 ~ 4000이다.

입력받은 수를 그대로 리스트의 인덱스로 참조하면 의도한 것과 다른 결과가 나올 것이다.

 

이 문제를 해결하기 위해서 카운트를 세는 배열의 인덱스는 모두 4000씩 더해준 값이 되도록 했다.

예를 들어,

만약에 5라는 숫자가 입력으로 들어왔다면 카운트를 세는 배열인 count의 count[5]를 증가시키는 것이 아니라,

count[4005]의 값을 증가시켰다.

-4000 ~ 4000의 범위를 오른쪽으로 밀어서 0 ~ 8000의 인덱스에 저장했다.

 

가장 많이 나온 숫자를 알기 위해서 카운트 배열에서 최댓값을 가지는 값의 인덱스를 freq라는 배열에 삽입한다.

배열에 삽입하는 이유는 최빈값이 여러 개가 될 수 있기 때문이다.

freq 배열에 저장된 값들은 가장 빈번하게 입력 받은 숫자들이다.

 

문제에서 최빈값이 여러 개가 존재할 경우 두 번째로 작은 값을 출력하라고 조건을 붙였다.

최빈값이 하나가 존재할 경우에는 그대로 출력하고,

만약 여러 개일 경우 freq[1], 두 번째 요소를 출력했다.

무조건 두 번째 요소가 두 번째로 작은 값인 이유는 freq 리스트에 최빈값을 추가할 때 가장 작은 인덱스부터 접근하면서 삽입했기 때문이다.

인덱스는 입력받은 숫자를 의미하기 때문에 두 번째로 삽입된 최빈값이 두 번째로 작은 최빈값이다.

 

4. 범위

범위는 입력 받은 수 중에서 최댓값 - 최솟값이다.

이미 위에서 중앙값을 구할 때 오름차순으로 정렬을 했다.

그러므로 맨 처음의 값과 마지막 값이 각각 최솟값, 최댓값이다.

 

3번 최빈값의 경우에

카운트 리스트에서 최빈값을 구하기 때문에 실제 값은 4000을 빼준 값이다.

카운트 리스트에 삽입할 때 음수를 넣기 위해서 4000을 더해주었기 때문이다.

 

 

반응형

관련글 더보기