알고리즘

C언어 - 백준 알고리즘 4344번(평균은 넘겠지)

chadongmin 2022. 12. 21. 22:43

배열 카테고리에서 가장 정답률이 낮은 마지막 문제이다.

 

처음으로 첫 제출에 답을 맞춘 것 같다. 기분이 매우 좋다.

전 문제는 숫자 0과 대문자 O를 헷갈려서 맞았는데도 계속 '틀렸습니다'만 나오길래 얼마나 화가 났었는데

속이 후련하다.

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

int main(void) {

	int loop; //루프를 돌 횟수와 학생수 변수 선언
	int num;//int stud[1000];
	int score; //학생의 점수를 담는 변수

	

	scanf("%d", &loop); //몇번 루프 돌 건지 입력받기

	for (int i = 0; i < loop; i++) { 
		int avg = 0; //평균 값을 담을 변수
		int cnt = 0; //평균이 넘는 학생들의 수를 담는 변수
		float rate = 0;

		scanf("%d", &num); //학생 수 입력

		//int stud[num];
		int* stud;
		stud = (int*)malloc(sizeof(int) * 1000); //가변길이 배열을 생성하기 위한 동적 할당

		stud[num];

		for (int k = 0; k < num; k++) { //입력한 수 만큼 학생의 점수를 입력받는 for문
			scanf("%d", &score);
			stud[k] = score;
			avg = avg + stud[k];
		}	
		avg = avg / num; //평균 구하기
		//printf("%d", avg);
		for (int j = 0; j < num; j++) {
			if (stud[j] > avg)
				cnt++;
		}
		rate = (float)cnt / num; //평균을 넘은 학생들의 수 (비율) 
		

		rate = rate * 100000; //반올림 구현
		
		rate = rate + 0.5;
		
		rate = floor(rate);
		
		rate = rate / 1000;
		printf("%.3f%%\n", rate);

	free(stud);
	}

	return 0;
}

이 문제를 풀기 위해서 어떤 방식으로 접근을 해야할지부터 생각을 했다. 일단 부딪혀보자는 식으로 코드부터 작성하면 매우 헤맬 가능성이 높다는 것을 깨달았기 때문이다. 이 문제의 첫번째 포인트는 C언어에서  배열의 크기를 변수로 지정할 수 있느냐였다. JAVA에선는 배열의 크기를 상수가 아닌 변수로 지정해도 문제가 되지 않지만 C언어에서는 동적할당을 사용해야 한다. 

 

두번째 포인트는 반올림 구현이다. Math 헤더파일을 선언하면 올림과 내림 함수를 사용할 수 있는데, 올림과 내림의 기준이 5이기 때문에 직접 구현해야 한다. 이 문제에서는 소수점 셋째 자리까지 출력하라고 했으니, 넷째 자리에서 반올림을 해야 한다. 

 

자세한 구현 방법은 주석에 자세히 서술해놓았다. 

 

이 문제를 풀면서 느낀 것은 어떻게 접근해야 하는지 고민을 (충분히) 많이 해야한다는 것을 느꼈다. 그리고 구현 능력이다.

나는 이 문제의 반올림 구현을 구글에 검색해서 아이디어를 얻었다. 하지만 코딩테스트를 볼 때도 구글에 검색을 할 수는 없을테니, 쌩으로 부딪혀서 (삽질을 하더라도)구현하는 능력도 필요하다고 생각한다.