풀이
최빈값을 구하는게 조금 까다로웠다.
int mode = arr[0], cnt = 1, temp_cnt, temp;
for (int i = 1; i < N; i++){
if (temp_cnt > cnt){
mode = arr[i];
temp_cnt = 0;
}else if (temp_cnt == cnt)
temp = arr[i];
if (arr[i] == mode) cnt++;
else if (arr[i] != arr[i-1]) temp_cnt = 0;
else temp_cnt++;
}
이후 mode와 temp 중 큰 값을 출력하는 방식으로 Test Case 예제는 통과했으나, 결과는 틀린것으로 나왔다.
때문에 이번 문제는 평범하게 -4000 ~ 4000의 범위에 해당하는 배열을 이용해 풀이했다.
- -4000 ~ 4000 중 입력받은 수에 해당하는 index의 값을 증가시키고, 최빈값의 개수를 저장했다.
- -4000부터 저장한 최빈값의 개수를 찾는데, 만약 두 번째 최빈값을 찾는다면 그 값이 최빈값중 두 번째로 작은 값이므로 탐색을 종료하고, 최빈값을 반환한다.
소스코드
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b){
int n1 = *(int*)a, n2 = *(int*)b;
if (n1 < n2)
return -1;
else if (n1 > n2)
return 1;
return 0;
}
int median(int *arr, int N){
if (N == 1)
return arr[0];
return arr[(N+1) / 2 - 1];
}
int mode(int *arr, int N){
int num[8001] = {0,}, max = 0, cnt = 0, idx;
for (int i = 0; i < N; i++){
num[idx = arr[i] + 4000]++;
max < num[idx] && (max = num[idx]);
}
idx = 0;
for (int i = 0; i < 8001 ; i++)
if (num[i] == max)
if (!cnt){
idx = i;
cnt++;
} else if (cnt == 1){
idx = i;
break;
}
return idx - 4000;
}
int main(){
int N, val;
scanf("%d", &N);
double sum = 0;
int arr[N];
for (int i = 0; i < N; i++){
scanf("%d", &arr[i]);
sum += arr[i];
}
qsort(arr, N, sizeof(int), compare);
printf("%.0f\n%d\n%d\n%d\n", sum/N, median(arr, N), mode(arr, N), arr[N-1] - arr[0]);
}
출처 및 참고자료
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 2805] 나무 자르기 [C] (0) | 2021.07.29 |
---|---|
[백준 01016] 제곱 ㄴㄴ 수 [C] (0) | 2021.07.29 |
[백준 1966] 프린터 큐 [C] (0) | 2021.07.28 |
[백준 1904] 01타일 [C] (0) | 2021.07.28 |
[백준 1929] 소수 구하기 [C] (0) | 2021.07.28 |