배열 카테고리에서 가장 정답률이 낮은 마지막 문제이다.
처음으로 첫 제출에 답을 맞춘 것 같다. 기분이 매우 좋다.
전 문제는 숫자 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이기 때문에 직접 구현해야 한다. 이 문제에서는 소수점 셋째 자리까지 출력하라고 했으니, 넷째 자리에서 반올림을 해야 한다.
자세한 구현 방법은 주석에 자세히 서술해놓았다.
이 문제를 풀면서 느낀 것은 어떻게 접근해야 하는지 고민을 (충분히) 많이 해야한다는 것을 느꼈다. 그리고 구현 능력이다.
나는 이 문제의 반올림 구현을 구글에 검색해서 아이디어를 얻었다. 하지만 코딩테스트를 볼 때도 구글에 검색을 할 수는 없을테니, 쌩으로 부딪혀서 (삽질을 하더라도)구현하는 능력도 필요하다고 생각한다.
'알고리즘' 카테고리의 다른 글
C언어 백준 알고리즘 11047번 (동전0) (0) | 2023.01.05 |
---|---|
C언어 - 백준 알고리즘 1065번 (한수) (0) | 2023.01.05 |
C언어 - 백준 알고리즘 2884 알람시계 (0) | 2022.04.12 |
소수(Prime number) 찾기 문제 (0) | 2022.04.10 |
C언어 - 백준 알고리즘 10926번 (0) | 2022.04.10 |