장학생 수 구하기
문제 설명
학기가 끝날 때마다 장학금을 주는데, 장학생이 몇 명인지 구하려 합니다.
장학생이 몇 명인지 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다.
1. 이번 학기 성적을 기준으로 학생별 석차를 구합니다.
2. 각 학생의 (이번 학기 성적 - 직전 학기 성적) 중 최댓값을 구합니다.
3. 아래 조건을 만족하는 학생을 발견하면, 장학생 수를 1 증가시킵니다.
3-1. 이번 학기 성적이 80점 이상이고, 석차가 상위 10% 이내인 경우
3-2. 또는 이번 학기 성적이 80점 이상이고, 석차가 1등인 경우
3-3. 또는 (이번 학기 성적 - 직전 학기 성적)이 2단계에서 구한 값과 같고, 그 값이 양수인 경우
4. 장학생 수를 return 합니다.
단, 동점인 학생은 등수가 같으며, 중복 수혜는 불가능합니다.
위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.
예시
current_grade | current_grade_len | last_grade | last_grade_len | return |
[70, 100, 70, 80, 50, 95] | 6 | [35, 65, 80, 50, 20, 60] | 6 | 3 |
예시 설명
학생 수가 10명보다 적으므로, 1등이 장학금을 받습니다.
직전 학기 대비 성적이 가장 많이 오른 학생은 다음과 같이 3명입니다.
- 35 → 70점
- 65 → 100점
- 60 → 95점
이때, 두 번째 학생은 이번 학기 1등 장학금을 이미 받아 중복 수혜가 불가능하고, 나머지 두 학생은 장학금을 받을 수 있습니다.
따라서 장학금을 받는 학생은 총 3명입니다.
코드 해석 및 전체 코드
int solution(int current_grade[], int current_grade_len, int last_grade[], int last_grade_len) {
int arr_length = current_grade_len;
int* rank = func_b(current_grade, arr_length);
int max_diff_grade = func_c(current_grade, last_grade, arr_length);
int answer = func_a(current_grade, last_grade, rank, arr_length, max_diff_grade);
return answer;
}
solution 함수의 흐름대로 함수 설명
func_b는 이번 학기 성적의 석차를 구하는 함수이다.
if문 in 이중 for문 ) 석차를 구하는 이중 for문으로 current[i]의 원소가 current_grade[0 ~ 5] 원소의 값보다 작을 때 rank[i]를 1씩 더하여 등수를 구하는 방식이다.
i가 0일 때 → current_grade[0] = 70
current_grade[0] = 70 |
current_grade[1] = 100 |
current_grade[2] = 70 |
current_grade[3] = 80 |
current_grade[4] = 50 |
current_grade[5] = 95 |
rank[0]++ | rank[0]++ | rank[0]++ |
rank[0] = 4로 currnet_grade[0]의 등수는 4등이다.
이런 식으로 계산되어 rank 배열은 {4, 1, 4, 3, 2, 6}이다.
func_c는 각 학생의 (이번 성적 - 직전 학기 성적) 중 최댓값을 구하는 함수이다.
if 문) max_diff_grade( = 1)가 current_grade[i] - last_grade[i]보다 작다면 max_diff_grade는 조건의 두번째 피연산자의 값이 대입된다.
i | current_grade[i] - last_grade[i] | if문 만족 | max_diff_grade |
0 | 70 - 35 = 35 | O | 35 |
1 | 100 - 65 = 35 | X | 35 |
2 | 70 - 80 = -10 | X | 35 |
3 | 80 - 50 = 30 | X | 35 |
4 | 50 - 20 = 30 | X | 35 |
5 | 95 - 60 = 35 | X | 35 |
이번 성적 - 직전 학기 성적 중 최댓값은 35이다.
func_a는 총 장학생의 수를 구하는 함수이다.
for문 ) 0 ~ arr_length(= 6) - 1만큼 반복한다.
if문 ) 첫 번째 조건인 이번 학기 성적이 80점 이상이고, 석차가 상위 10% 이내인 경우를 구하는 if문이다.
current_grade 배열은 점수를 담은 배열이고, rank 배열은 석차를 담은 배열이다.
i | current_graade[i] | current_graade[i] >= 80 | rank[i] | rank[i] <= arr_length / 10 | count |
0 | 70 | X | 4 | X | |
1 | 100 | O | 1 | X | |
2 | 70 | X | 4 | X | |
3 | 80 | O | 3 | X | |
4 | 50 | X | 2 | X | |
5 | 95 | O | 6 | X |
학생 수가 6명으로 석차 상위 10%( = 0.6)은 없어 else if로 넘어간다.
else if 1) if문 조건 또는 이번 학기 성적이 80점 이상이고, 석차가 1등인 경우를 구하는 if문이다.
i | current_graade[i] | current_graade[i] >= 80 | rank[i] | rank[i] == 1 | count |
0 | 70 | X | 4 | X | |
1 | 100 | O | 1 | O | count++ |
2 | 70 | X | 4 | X | |
3 | 80 | O | 3 | X | |
4 | 50 | X | 2 | X | |
5 | 95 | O | 6 | X |
점수가 80점이 넘고 1등인 학생은 1명이므로 count는 1 증가되었다.
else if 2) 위의 조건 또는 (이번 학기 성적 - 직전 학기 성적)이 2단계에서 구한 값과 같고, 그 값이 양수인 경우를 구하는 if문이다.
max_diff_grade(이번 학기 성적 - 직전 학기 성적)는 35이다.
i | current_grade[i] - last_grade[i] | max_diff_grade | count |
0 | 70 - 35 = 35 | O | +1 |
2 | 70 - 80 = -10 | X | |
3 | 80 - 50 = 30 | X | |
4 | 50 - 20 = 30 | X | |
5 | 95 - 60 = 35 | O | +1 |
최댓값은 35로 3명의 학생이지만 current_grade[1]은 이미 두 번째 조건에 해당되어 if문을 빠져나왔으므로
이 조건에선 count가 2 증가된다.
최종 return될 count는 3이다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int func_a(int current_grade[], int last_grade[], int rank[], int arr_length, int max_diff_grade) {
int count = 0;
for (int i = 0; i < arr_length; i++) {
if (current_grade[i] >= 80 && rank[i] <= arr_length / 10)
count++;
else if (current_grade[i] >= 80 && rank[i] == 1)
count++;
else if (max_diff_grade == current_grade[i] - last_grade[i])
count++;
}
return count;
}
int* func_b(int current_grade[], int arr_length) {
int* rank = (int*)malloc(sizeof(int) * arr_length);
for (int i = 0; i < arr_length; i++)
rank[i] = 1;
for (int i = 0; i < arr_length; i++)
for (int j = 0; j < arr_length; j++)
if (current_grade[i] < current_grade[j])
rank[i]++;
return rank;
}
int func_c(int current_grade[], int last_grade[], int arr_length) {
int max_diff_grade = 1;
for (int i = 0; i < arr_length; i++) {
if (max_diff_grade < current_grade[i] - last_grade[i])
max_diff_grade = current_grade[i] - last_grade[i];
}
return max_diff_grade;
}
int solution(int current_grade[], int current_grade_len, int last_grade[], int last_grade_len) {
int arr_length = current_grade_len;
int* rank = func_b(current_grade, arr_length);
int max_diff_grade = func_c(current_grade, last_grade, arr_length);
int answer = func_a(current_grade, last_grade, rank, arr_length, max_diff_grade);
return answer;
}
int main() {
int current_grade[6] = { 70, 100, 70, 80, 50, 95 };
int current_grade_len = 6;
int last_grade[6] = { 35, 65, 80, 50, 20, 60 };
int last_grade_len = 6;
int ret = solution(current_grade, current_grade_len, last_grade, last_grade_len);
printf("solution 반환 값은 %d입니다.\n", ret);
}
구름 goormedu COS PRO 2급 기출문제 - C언어
[3차] 문제2) 장학생 수 구하기
'코딩 테스트 > [c언어] cos pro 2급 기출문제' 카테고리의 다른 글
[No.24] 단어의 오타 수정하기 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.14 |
---|---|
[No.23] 체조 선수의 점수 구해주기 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.14 |
[No.21] 학생의 등수 구하기 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.13 |
[No.20] 상품권 총 지급액 구하기 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.12 |
[No.19] 투표에 대한 후보 찾기 / cos pro 2급 c언어 기출 문제 (0) | 2021.05.12 |
댓글