2108
2108번 문제#include
#include
#define MAX 5000
#define MAXSIZE 4000
int main(void) {
int i, j, temp, n, n1 = 0, n2, n3 = '\0', n4, max = 0, c;
int arr[MAX], count[8001];
scanf("%d", &n);
for (i = 0; i <= 8000; i++) // count 함수 초기화하기
count[i] = 0;
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
n1 += arr[i];// 산술평균
c = ++count[arr[i]+4000]; // 최빈값을 구하기 위한 빈도수 세기
max = (c > max) ? c : max; // 최빈값 구하기
}
for (i = 0; i < n - 1; i++) { // bubble sort 정렬
for (j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0, j=0; i < n; i++) { // 최빈값 구하기
if (count[arr[i] + 4000] == max) { // 만약 빈도수가 max 값과 같다면 이 값은 빈도 수가 가장 높은 원소들 중 하나일 것이다
if (n3!='\0'&& n3!=arr[i]) {//n3에 값이 들어간 것이 처음일 때
n3 = arr[i];
break;
}
n3 = arr[i];
}
}
printf("%.0f\n%d\n%d\n%d", floor((double)n1/n), arr[n / 2], n3 , arr[n-1] - arr[0]);
}
결과
전에 했던 정렬를 이용하여 푸는 문제였다. 산술평균은 처음에 값을 입력 받을 때 더하기로 하였고, 중앙값은 정렬한 후에 중간 인덱스의 값을 출력하면 구할 수 있었다. 또한 최대값과 최솟값의 차이는 정렬한 후 양 끝에 있는 원소들을 빼주면 쉽게 구할 수 있었다. 다만 최빈값이 기존 정렬에서 새로운 값을 꺼내어 새롭게 정렬해야하기 때문에 조금 곤란했다. 우선 처음에 최빈값만 구하고 후에 정렬된 뒤에 최빈값에 맞는 원소를 찾아 두번째로 작은 원소를 쉽게 출력할 수 있도록 하였다.
+) 참고