본문 바로가기
코딩 테스트/[c언어] cos pro 2급 기출문제

[No.22] 장학생 수 구하기 / cos pro 2급 c언어 기출 문제

by M개발자 2021. 5. 13.
반응형

장학생 수 구하기

문제 설명

 

학기가 끝날 때마다 장학금을 주는데, 장학생이 몇 명인지 구하려 합니다.

 

장학생이 몇 명인지 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다.

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
1 100 - 65 = 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);
}

cos pro 2급 기출문제

github

 

구름 goormedu COS PRO 2급 기출문제 - C언어

[3차] 문제2) 장학생 수 구하기

반응형

댓글