본문 바로가기

cospro2급/cospro_3차

2021-05-13

cospro 2급 2번 문제

장학생 수 구하기

 

문제 설명

모 학교에서는 학기가 끝날 때마다 장학금을 준다. 이때 장학생이 몇 명인지 구하려고 한다.

장학금을 주는 조건은 다음과 같다.

  1. 이번 학기 성적이 80점 이상(100점 만점)이면서 석차가 상위 10% 이내인 학생

  2. 이번 학기 성적이 80점 이상이면서 1등인 학생

  3. 직전 학기 대비 성적이 가장 많이 오른 학생(여러 명인 경우 해당 학생 전부) 단, 동점인 학생들은 등수가 같으며

      중복 수혜는 불가하다.

 

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

  1. 이번 학기 성적을 기준으로 학생별 석차를 구한다.

  2. 각 학생의 (이번 학기 성적 -  직전 학기 성적) 중 최댓값을 구한다.

  3. 아래 조건을 만족하는 학생을 발견하면, 장학생 수를 1 증가시킨다.

     3-1. 이번 학기 성적이 80점 이상이고, 석차가 상위 10% 이내인 경우

     3-2. 또는 이번 학기 성적이 80점 이상이고, 석차가 1등인 경우

     3-3. 또는 (이번 학기 성적 - 직전 학기 성적)이 2단계에서 구한 값과 같고, 그 값이 양수인 경우

  4. 장학생 수를 return 한다.  

 

학생들의 이번 학기 성적을 담고 있는 배열 current_grade와 current_grade의 길이 current_grade_len, 직전 학기 성적을 담고 있는 배열 last_grade와 last_grade의 길이 last_grade_len이 매개변수로 주어질 때, 장학생 수를 return하는 solution 함수를 완성한다.

 

매개변수 설명

학생들의 이번 학기 성적을 담고 있는 배열 current_grade와 current_grade의 길이 current_grade_len, 직전 학기 성적을 담고 있는 배열 last_grade와 last_grade의 길이 last_grade_len이 매개변수로 주어진다.

 

   current_grade_len과 last_grade_len은 같으며, 1 이상 200 이하의 자연수이다.

   current_grade와 last_grade의 원소는 0 이상 100 이하인 정수이다.

 

return 값 설명

장학생 수를 return 한다.

 

예시

 

예시 설명

학생 수가 10명보다 적으므로, 1등이 장학금을 받는다.

직전 학기 대비 성적이 가장 많이 오른 학생은 다음과 같이 3명이다.

 

  35 ->70점

  65 -> 100점

  60 -> 95점

  

이때, 두 번째 학생은 이번 학기 1등 장학금을 이미 받아 중복 수혜가 불가하고, 나머지 두 학생은 장학금을 받을 수 있다. 따라서 장학금을 받는 학생은 총 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++) {
    	//점수가 80점 이상이고 석차가 상위 10% 이내인 학생
        if (current_grade[i] >= 80 && rank[i] <= arr_length / 10)
            count++;
            //점수가 80점 이상이고 1등인 학생
        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, current_grade_len);
    int max_diff_grade = func_c(current_grade, last_grade, current_grade_len);
    int answer = func_a(current_grade, last_grade, rank, current_grade_len, 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);
}

 

 

 

goorm

구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.

www.goorm.io

 

'cospro2급 > cospro_3차' 카테고리의 다른 글

2021-05-16  (0) 2021.05.16
2021-05-15  (0) 2021.05.15
2021-05-15  (0) 2021.05.15
2021-05-14  (0) 2021.05.14
2021-05-13  (0) 2021.05.13