[C]백준 12.정렬: 2108
백준2108
내코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int arr[500001];
int num[8001] = { 0, };
int compare(const void* a, const void* b) {
if (*(int*)a < *(int*)b)
return -1;
if (*(int*)a > * (int*)b)
return 1;
return 0;
}
int main() {
int n;
scanf("%d", &n);
int sum = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
sum += arr[i];
num[arr[i] + 4000]++;
}
int avg = round((double)sum / n);
qsort(arr, n, sizeof(int), compare);
int median = arr[n / 2];
int range = arr[n - 1] - arr[0];
int max = 0;
for (int i = 0; i < 8001; i++) {
if (num[i] > max) {
max = num[i];
}
}
int marr[8001];
int k = 0;
for (int i = 0; i < 8001; i++) {
if (num[i] == max) {
marr[k++] = i - 4000;
}
}
int mode;
if (k == 1) {
mode = marr[0];
}
else {
mode = marr[1];
}
printf("%d\n%d\n%d\n%d\n", avg, median, mode, range);
return 0;
}
산술평균은 N개의 수들의 합을 N으로 나눈 것이다. 그래서 입력받은 값을 arr배열에 저장한 뒤 그 값을 0으로 초기화해둔 sum에 더했고, 반올림함수인 round를 이용해 반올림한 값을 avg 변수에 저장했다.
중앙값은 값들을 정렬했을 때 중앙에 있는 값이므로 먼저 qsort()함수를 이용해 arr배열에 저장된 값들을 정렬했다. n은 홀수이며 정수이기 때문에 n/2를 하면 n을 2로 나눈 몫이 된다. 예를 들어 n이 5라면 n/2는 2가 된다. 그런데 배열의 인덱스는 0부터 시작하기 때문에 그 2값이 중앙값에 해당하는 인덱스가 된다. 따라서 n/2인덱스에 해당하는 배열을 median 변수에 저장했다.
범위는 입력받은 값중 가장 큰값에서 작은 값을 빼면 된다. 그래서 정렬된 arr배열의 마지막 인덱스 값에서 0인덱스 값을 뺀 것을 range 변수에 저장했다.
최빈값은 N개의 수들 중 가장 많이 나타나는 값이다. 그래서 해당 값이 몇번 입력되었는지 알기 위해 배열을 이용하려고 했다. 입력된 정수의 절대값은 4000을 넘지 않기 때문에 -4000~4000이 가능하므로 미리 크기가 8001인 num 배열을 0으로 초기화해두었다. 그리고 입력받은 값이 음수일 수도 있기에 입력받은 값+4000에 해당하는 인덱스에 해당 값이 몇번 입력되었는 지 저장하였다. 그 후 반복문을 통해 num 배열의 값 중 가장 큰 값인 max를 찾았고, 다시 반복문을 통해 배열의 값이 max인 인덱스를 marr배열에 저장했다. 그 후 marr배열에 저장된 원소가 1개라면 maar[0]을, 그 외엔 marr[1]을 mode 변수에 저장했다.
다른 사람들의 코드를 보니 산술평균을 구할 때 반올림을 하기 위해 round함수를 사용하지 않고 %.0f을 이용해도 되는 것 같다.
%.nf는 소수점 이하 n번째 자리까지 표시한다는 의미라고 한다. 잘 알아둬야겠다.
또 중앙값을 구하는 인덱스는 ((n+1)/2)+1이 정석적으로 구하는 방법인 것 같다.
<참고 링크>
https://mjeong9316.tistory.com/172
[C 언어] 백준 2108. 통계학
2108. 통계학 (누르면 해당 문제로 이동) 정렬을 활용하는 문제 제약사항) 시간 : 2 초 메모리 : 256 MB 문제) 수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는
mjeong9316.tistory.com