
최빈값만 빼면 브론즈일 정도로 쉬움. 최빈값 구하기가 빡셈.
기본적으로 입력값 배열을 오름차순으로 정렬해야함 -> quick sort 이용.
먼저 수가 등장하는 빈도를 받고, 최빈값을 탐색한 다음, 반복문을 돌려 최빈값이 하나가 아니라 더 있을 때는 break하고 두번째 최빈값을 출력. 하나밖에 없으면 유일한 최빈값을 출력.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int compare(const void* a, const void* b) {
int A = *(int*)a;
int B = *(int*)b;
if (A>B)
return 1;
return 0;
}
void input(int* arr, int n) {
for (int i=0; i<n; i++)
scanf("%d", &arr[i]);
qsort(arr,n,sizeof(int),compare);
}
void average(int* arr, int n) {
int sum=0;
for (int i=0; i<n; i++)
sum+=*(arr+i);
printf("%d\n", (int)round((float)sum/n));
}
void median (int* arr, int n) {
printf("%d\n", arr[n/2]);
}
void mode (int* arr, int n) {
int freq[n];
freq[0]=1;
for (int i=1; i<n; i++)
freq[i]=0; //빈도수 배열 초기화
int k=0;
for (int i=1; i<n; i++) { //빈도수 체크
if (arr[i]==arr[i-1])
freq[k]++;
else {
k=i;
freq[k]++;
}
}
int mode = arr[0];
int mode_freq = freq[0];
for (int i=1; i<n; i++) {
if (mode_freq < freq[i]) { //최빈값과 최빈값의 빈도수
mode = arr[i];
mode_freq = freq[i];
}
}
int cnt = 0;
for (int i = 0; i<n; i++) {
if (freq[i] == mode_freq)
cnt++;
if (cnt == 2) {
printf("%d\n", arr[i]);
break;
}
}
if (cnt<=1)
printf("%d\n", mode);
}
void range (int* arr, int n) {
printf("%d\n", arr[n-1]-arr[0]);
}
int main() {
int n;
scanf("%d", &n);
int arr[n];
input(arr,n);
average(arr,n);
median(arr,n);
mode(arr,n);
range(arr,n);
return 0;
}