백준 2108 : 통계학

생각보다 많이 귀찮았던 문제이다. 사실 문제 자체는 이전 정렬문제들의 혼합버전같은 느낌이었다

단지, 이번에는 수의 범위가 양수만이 아닌 음수도 포함되어 있다는 점 까지 고려해서 코드를 작성하면 되겠다.

 

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
	int num1 = *(int *)a;
	int num2 = *(int *)b;
	
	if (num1 > num2)
		return 1;
	else if(num1 < num2)
		return -1;
	else if(num1 == num2)
		return 0;
	
}

int solve() {
	int N, sum = 0, freq = 0, range = 0;
	int cnt[8001] = {0,}, check[8001] = {0,};
	scanf("%d", &N);
	
	int arr[N];
	
	for(int i=0;i<N;i++) {
		scanf("%d", &arr[i]);
		if(arr[i] >= 0)
			cnt[arr[i]+4000]++;
		else
			cnt[4000-abs(arr[i])]++;
	}
	
	//산술평균을 위한 합 구하기
	for(int i=0;i<N;i++)
		sum += arr[i];
	
	//중앙값 계산을 위한 배열 정렬
	qsort(arr, sizeof(arr)/sizeof(int), sizeof(int), compare);
	
	//최빈값 계산
	for(int i=0;i<8001;i++) {
		if(cnt[i] >= freq)
			freq = cnt[i];
	}
	
	int temp = 0;
	for(int i=0;i<8001;i++) {
		if(freq == cnt[i]) {
			check[temp] = i;
			temp++;
		}
	}

	//산술평균
	if((double)sum/(double)N > -0.5 && (double)sum/(double)N < 0)
		printf("%d\n", 0);
	else
		printf("%.0lf\n", (double)sum/(double)N);
	//중앙값
	printf("%d\n", arr[N/2]);
	//최빈값
	if(temp == 1)
		printf("%d\n", check[0]-4000);
	else
		printf("%d\n", check[1]-4000);
	//범위
	printf("%d\n", arr[N-1]-arr[0]);
}

int main() {
	solve();
	return 0; 
}

 

확실히 이전에 배웠던 요소들을 써먹으면서 문제를 푸니까 성장한 느낌이 들어서 기분이 매우 굿 ㅎ

문제 업데이트해서 고쳐서 다시 올려씀,,

'백준 (C99) > 정렬 (完)' 카테고리의 다른 글

백준 11650 : 좌표 정렬하기  (0) 2022.02.06
백준 1427 : 소트인사이드  (0) 2022.02.05
백준 10989 : 수 정렬하기 3  (0) 2022.02.05
백준 2751 : 수 정렬하기 2  (0) 2022.02.03
백준 2750 : 수 정렬하기  (0) 2022.02.03