생각보다 많이 귀찮았던 문제이다. 사실 문제 자체는 이전 정렬문제들의 혼합버전같은 느낌이었다
단지, 이번에는 수의 범위가 양수만이 아닌 음수도 포함되어 있다는 점 까지 고려해서 코드를 작성하면 되겠다.
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
int num1 = *(int *)a;
int num2 = *(int *)b;
if (num1 > num2)
return 1;
else if(num1 < num2)
return -1;
else if(num1 == num2)
return 0;
}
int solve() {
int N, sum = 0, freq = 0, range = 0;
int cnt[8001] = {0,}, check[8001] = {0,};
scanf("%d", &N);
int arr[N];
for(int i=0;i<N;i++) {
scanf("%d", &arr[i]);
if(arr[i] >= 0)
cnt[arr[i]+4000]++;
else
cnt[4000-abs(arr[i])]++;
}
//산술평균을 위한 합 구하기
for(int i=0;i<N;i++)
sum += arr[i];
//중앙값 계산을 위한 배열 정렬
qsort(arr, sizeof(arr)/sizeof(int), sizeof(int), compare);
//최빈값 계산
for(int i=0;i<8001;i++) {
if(cnt[i] >= freq)
freq = cnt[i];
}
int temp = 0;
for(int i=0;i<8001;i++) {
if(freq == cnt[i]) {
check[temp] = i;
temp++;
}
}
//산술평균
if((double)sum/(double)N > -0.5 && (double)sum/(double)N < 0)
printf("%d\n", 0);
else
printf("%.0lf\n", (double)sum/(double)N);
//중앙값
printf("%d\n", arr[N/2]);
//최빈값
if(temp == 1)
printf("%d\n", check[0]-4000);
else
printf("%d\n", check[1]-4000);
//범위
printf("%d\n", arr[N-1]-arr[0]);
}
int main() {
solve();
return 0;
}
확실히 이전에 배웠던 요소들을 써먹으면서 문제를 푸니까 성장한 느낌이 들어서 기분이 매우 굿 ㅎ
문제 업데이트해서 고쳐서 다시 올려씀,,
'백준 (C99) > 정렬 (完)' 카테고리의 다른 글
백준 11650 : 좌표 정렬하기 (0) | 2022.02.06 |
---|---|
백준 1427 : 소트인사이드 (0) | 2022.02.05 |
백준 10989 : 수 정렬하기 3 (0) | 2022.02.05 |
백준 2751 : 수 정렬하기 2 (0) | 2022.02.03 |
백준 2750 : 수 정렬하기 (0) | 2022.02.03 |
Comment