본문 바로가기
Cospro 2급/C언어

[4차] 문제3. 획득 점수 구하기. 도박은 안되요. 답안 및 풀이

by SRin23 2021. 5. 19.

◇ 문제 설명

A와 B가 카드 게임을 할때, 누가 더 많은 점수를 획득했는지, 또 획득한 점수는 몇 점인지 알아보려고 합니다. 게임의 규칙은 다음과 같습니다.
 ▶ 알파벳 a, b, c, d, e가 적힌 카드뭉치가 있습니다.
 ▶ A와 B가 서로 번갈아 가면서 n장씩 카드를 뽑습니다.
 ▶ 소유한 카드 점수를 합산합니다. 알파벳 카드 한 장당 a = 1점, b = 2점, c = 3점, d = 4점, e = 5점으로 점수를 계산합니다.
 ▶ 점수가 높은 사람이 승리합니다.

게임에서 이긴 사람과 획득 점수를 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. A와 B가 번갈아가며 가져간 카드를 각각 배열에 넣습니다. 
2. A와 B가 각각 획득한 점수를 구합니다.
3. 획득한 점수가 큰 사람과 획득한 점수를 순서대로 배열에 담아 return합니다.

뽑아야하는 카드 개수 n, 카드를 나타내는 문자 배열 bundle, bundle의 길이 bundle_len이 매개변수로 주어질때, 이긴 사람과 점수를 return하도록 solution함수를 작성하려 합니다. 위 구조를 참고하여, 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c함수와 매개변수를 알맞게 채워주세요.

 

◇ 매개변수 설명

뽑아야하는 카드 개수 n, 카드를 나타내는 문자 배열 bundle, bundle의 길이 bundle_len이 solution함수의 매개변수로 주어집니다.
 ▶ n은 1이상 25 이하인 자연수입니다.
 ▶ bundle의 모든 원소는 알파벳 소문자입니다.
 ▶ bundle_len은 2이상 2*n이하입니다.

 

◇ return값 설명

이긴 사람과 획득한 점수를 return합니다.
A가 이겼을 경우에는 1, B가 이겼을 경우에는 2, 무승부일 경우에는 0을 return 해주세요

 

◇ 예시

n bundle bundle_len return
4 "cacdbdedccbb" 12 [0, 13]

 

◇ 예시 설명

A는 c, c, b, e카드를 뽑았고, B는 a, d, d, d카드를 뽑았습니다. A가 획득한 점수는 13점이고, B가 획득한 점수 또한 13점 입니다. 둘다 13점을 획득하여 게임을 무승부로 끝납니다.

 

◇ 초기 내용

[출처]goormedu COSPRO 2급 기출문제[4차] 문제3 초기내용

 


◇ 답안

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

char* func_a(char* bundle, int start, int n) {
    char* answer = (char*)malloc(sizeof(char) * n);
    for(int i=0; i<n; i++)
        answer[i] = bundle[start+i*2];
    return answer;
}

int* func_b(int score1, int score2) {
    int* answer = (int*)malloc(sizeof(int) * 2);
    if(score1 > score2) {
        answer[0] = 1;
        answer[1] = score1;
    }
    else if(score1 < score2) {
        answer[0] = 2;
        answer[1] = score2;
    }
    else {
        answer[0] = 0;
        answer[1] = score1;
    }
    return answer;
}

int func_c(char* card, int card_length) {
    int answer = 0;
    for(int i = 0; i < card_length; i++) {
        answer += card[i] - 'a' + 1;
    }
    return answer;
}

int* solution(int n, char* bundle) {
    char* a_cards = func_a(bundle, 0, n);
    char* b_cards = func_a(bundle, 1, n);
    int a_score = func_c(a_cards, n);
    int b_score = func_c(b_cards, n);
    int* answer = func_b(a_score, b_score);
    return answer;
}

int main() {
    int n = 4;
    char* bundle = "cacdbdedccbb";    
    int* ret = solution(n, bundle);

    printf("solution 함수의 반환 값은 [");
    for(int i = 0; i < 2; i++){
        if (i != 0) printf(", ");
        printf("%d", ret[i]);
    }
    printf("] 입니다.\n");
}

 

◇ 답안 힌트

더보기

    ▶ 함수에 따라 알맞은 매개변수를 작성하세요

    ▶ A의 첫 시작은 0번, B의 첫 시작은 1번부터 입니다.

 

◇ 답안 풀이

(※ 실행 흐름 순으로 해석됩니다.)

 

//answer배열에 A또는 B가 뽑는 카드를 순서대로 저장

//A는 첫순서이므로 0번방부터, B는 두번째 순서이므로 1번방부터 시작한다.

char* func_a(char* bundle, int start, int n) {
    char* answer = (char*)malloc(sizeof(char) * n);
    for(int i=0; i<n; i++)
        answer[i] = bundle[start+i*2];
    return answer;
}


//카드의 점수를 구하는 함수

//card[i] - 'a' -> 'a'가 0이된다. -> +1을 하므로 'a'는 1, 'b'는 2 ....

int func_c(char* card, int card_length) { 
    int answer = 0; 
    for(int i = 0; i < card_length; i++) { 
        answer += card[i] - 'a' + 1; 
    } 
    return answer; 
} 



//A와 B 중 누가 이겼는지 구하는 함수

int* func_b(int score1, int score2) { 
    int* answer = (int*)malloc(sizeof(int) * 2); 

    //만약 A의 점수가 B보다 크면 1과 A의 점수 반환
    if(score1 > score2) {
        answer[0] = 1;
        answer[1] = score1;
    }

    //만약 B의 점수가 A보다 크면 2와 B의 점수 반환
    else if(score1 < score2) {
        answer[0] = 2;
        answer[1] = score2;
    }

    //만약 A와 B의 점수가 같으면 0과 동점인 점수(아무나 괜찮음) 반환
    else {
        answer[0] = 0;
        answer[1] = score1;

        //answer[1] = score2; 
    }
    return answer;
}


int* solution(int n, char* bundle) {

    //A가 가질 카드와 B가 가질 카드 계산
    char* a_cards = func_a(bundle, 0, n);
    char* b_cards = func_a(bundle, 1, n);

 

    //A와 B의 카드를 받아 score계산
    int a_score = func_c(a_cards, n);
    int b_score = func_c(b_cards, n);

 

    //A와 B의 점수에 따라 무승부, 승리를 계산
    int* answer = func_b(a_score, b_score); 
    return answer;
}

 

 

◇ 실행결과

[4차] 문제3) 획득 점수 구하기. 도박은 안되요 실행결과

 

◇ 출처

https://edu.goorm.io/learn/lecture/16921/cos-pro-2%25EA%25B8%2589-%25EA%25B8%25B0%25EC%25B6%259C%25EB%25AC%25B8%25EC%25A0%259C-c%25EC%2596%25B8%25EC%2596%25B4

 

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

YBM IT에서 시행하는 COS Pro 자격증 기출문제를 직접 풀어볼 수 있는 실습 위주의 강좌입니다.

edu.goorm.io

 

댓글