#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int compare(const void *a, const void *b) { // sort 함수에 사용할 정렬 함수
int na = *(int *)a;
int nb = *(int *)b;
if (na < nb) return -1;
if (na > nb) return 1;
return 0;
}
int main() {
int N; // 입력할 숫자 개수
int ns[500000]; // 입력된 숫자를 저장할 배열
int ns_count[8001] = {0}; // 각 숫자의 빈도수 카운트 저장용 배열 선언 후 0으로 초기화.
double sum = 0; // 평균을 내기 위해 숫자들의 합을 저장할 변수. 값이 커질 수 있으므로 double로.
int max_count_d = 0, max_count_n = 0, max_count_v = 0; // 최빈값 중북횟수, 최빈값, 최빈값 카운터 저장할 변수.
int i;
scanf("%d", &N); // 입력할 숫자 개수값을 입력 받음
for(i = 0; i < N; i++) { // 지정한 개수만큼 반복해서 입력을 받음
scanf("%d", &ns[i]);
sum += ns[i]; // 속도를 위해 입력받으면서 합을 미리 계산함.
}
// 1.산술평균 출력
printf("%d\n", (int)round(((sum / N)))); // 더한값을 N으로 나누고 반올림.
// 2.중앙값 출력
qsort(ns, N, sizeof(int), compare); // 오른차순으로 정렬
printf("%d\n", ns[N / 2]); // 정렬된 수에서 중간에 있는 값을 출력
// 3.최빈값 출력
for(i = 0; i < N; i++) { // 숫자별 빈도수를 배열로 카운트한다.
ns_count[ns[i] + 4000]++; // 4000 인덱스가 숫자 0을 의미. 숫자값에 해당하는 인덱스 값 증가
}
for(i = 0; i <= 8000; i++) {
if(max_count_v <= ns_count[i]) { // 빈도수가 더 높거나 같으면 최빈값으로 대입
if(max_count_v == ns_count[i]) max_count_d++;// 값이 같으면 중복횟수 기록
else max_count_d = 0; // 같지 않으면 중복횟수 0.
max_count_n = i; // 최빈값 저장
max_count_v = ns_count[i]; //최빈 빈도수 저장
}
}
if(max_count_d == 0) { // 최빈값이 하나만 존재하므로..
printf("%d\n", max_count_n - 4000); // 최빈값이 하나면 그대로 출력
} else { // 같은 최빈값이 존재하므로 두분째 작은 최빈값을 찾음
max_count_d = 0; // 반복값 체크용으로 다시 사용.
for(i = 0; i <= 8000; i++) {
if(ns_count[i] == max_count_v) { // 최빈값하고 같으면
if(max_count_d == 1) { // 첫번째 값이 있었다면 두번째 이므로 출력
printf("%d\n", i - 4000); // 두번째 작은 최빈값 출력
break; // 루틴을 끝냄
} else max_count_d++; // 중복 최빈값 순서 체크
}
}
}
// 4.범위 출력 : 정렬되어 있으므로 배열 마지막값이 최댓값, 처음값이 최솟값
printf("%d", ns[N - 1] - ns[0]); // 최대값에서 최솟값을 빼서 출력
return 0;
}