본문 바로가기

문제풀이/C 문제풀이

2108

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]);
}

결과

2108.png

전에 했던 정렬를 이용하여 푸는 문제였다. 산술평균은 처음에 값을 입력 받을 때 더하기로 하였고, 중앙값은 정렬한 후에 중간 인덱스의 값을 출력하면 구할 수 있었다. 또한 최대값과 최솟값의 차이는 정렬한 후 양 끝에 있는 원소들을 빼주면 쉽게 구할 수 있었다. 다만 최빈값이 기존 정렬에서 새로운 값을 꺼내어 새롭게 정렬해야하기 때문에 조금 곤란했다. 우선 처음에 최빈값만 구하고 후에 정렬된 뒤에 최빈값에 맞는 원소를 찾아 두번째로 작은 원소를 쉽게 출력할 수 있도록 하였다.
+) 참고

'문제풀이 > C 문제풀이' 카테고리의 다른 글

1181  (0) 2019.03.01
1427  (0) 2019.03.01
10989  (0) 2019.03.01
2750  (0) 2019.03.01
10039  (0) 2019.02.28