백준

2108번 통계학(정렬) - ☆

조주똥 2020. 7. 15. 20:41

#문제링크 : https://www.acmicpc.net/problem/2108

<전략>

1. 최빈값 계산을 편리하게 하고 더 적은 시간복잡도로 문제를 해결하기 위해 카운팅 정렬처럼 각 숫자를 입력받아 숫자들을 a배열의 인덱스로 취급한다. 단, 절대값이 4000이라 음수값이 나올 수 있으므로 -4000에 대비해 각 숫자들에 4000을 더한 후 a배열의 인덱스로 취급한다. 그리고 해당 인덱스의 배열 값을 하나 증가시킨다.

2. 평균값은 처음 입력을 받으면서 총합을 미리 계산해주고, 최빈값은 a배열값중 가장 큰값을 mx변수에 저장한 후 다시 반복문을 돌면서 a배열에서 mx와 값이 같으면 fre에 인덱스-4000(처음에 4000 더해줬으므로)값을 저장한다. 만약 최빈값이 여러개라면 cnt변수가 2가 될때 멈추도록 한다. 중앙값은 다시 cnt변수를 0으로 초기화하고 a[0]부터 a[8000]까지 카운트를 누적합한다. 누적합 진행중 cnt값이 n/2 + 1보다 (n은 항상 홀수이므로) 같거나 커지는 순간의 인덱스를 중앙값으로 저장한다.

3. 범위는 처음 a[i]값이 0이 아닌값이 나오면 start에 i-4000을 저장하고, 다시 반복문을 돌려 cnt를 0으로 초기화하고 누적합을 계산후 cnt값이 n보다 같거나 커지면 end에 i-4000을 저장한다. ran(범위)는 end - start이므로 해당 값을 출력한다.