C

[C]백준 12.정렬: 2108

열지희공 2022. 1. 22. 00:40

백준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