티스토리 뷰

문제 설명

 

카드를 3장 뽑아 점수를 내는 게임을 하려고 합니다. 각 카드는 색이 칠해져 있고, 숫자가 적혀 있습니다.

획득한 점수를 계산하는 규칙은 다음과 같습니다.

 

  1. 카드 3장의 색이 모두 같다면 획득한 점수는 적힌 숫자의 총합에 3을 곱한 값입니다.
  2. 카드 2장의 색이 같고, 1장의 색이 다르다면 획득한 점수는 적힌 숫자의 총합에 2를 곱한 값입니다.
  3. 카드 3장의 색이 모두 다르다면 획득한 점수는 적힌 숫자의 총합입니다.

뽑은 카드의 색과 숫자를 문자열로 담은 2차원 배열 cards, cards의 길이 cards_len이 매개변수로 주어질 때, 획득한 총 점수를 return하도록 solution함수를 작성해주세요.

 


매개변수 설명

뽑은 카드의 색과 숫자를 문자열로 담은 2차원 배열 cards, cards의 길이 cards_len이 매개변수로 주어집니다.

  • cards는 3x2 크기인 2차원 배열입니다.
  • cards_len은 항상 3입니다.
  • caeds의 각 원소는 [색, 숫자] 입니다.
  • 카드의 색은 ["red","black","blue"] 중 하나입니다.
  • 카드에 적힌 숫자는 1 이상 9 이하인 자연수입니다.

예시

  cards cards_len return
예시 #1 [["blue","2"]["red","5"]["black","3"]]  3 10
예시 #2 [["blue","2"]["blue","5"]["black","3"]]  3 20

 

 

 

 

 


 

 

 

 

 

주어진 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(char* cards[][2], int cards_len) {
    int answer = 0;
		
        	//빈칸

    return answer;
}
int main() {
    char* cards1[][2] = {{"blue", "2"}, {"red", "5"}, {"black", "3"}};
    int cards_len1 = 3;
    int ret1 = solution(cards1, cards_len1);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret1);

    char* cards2[][2] = {{"blue", "2"}, {"blue", "5"}, {"black", "3"}};
    int cards_len2 = 3;
    int ret2 = solution(cards2, cards_len2);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret2);
}

 

 

 

 

 

 

 

 

완성 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(char* cards[][2], int cards_len) {
    int answer = 0;
		int count=0;

		if(!strcmp(cards[0][0],cards[1][0])) count++;
		else if(!strcmp(cards[1][0],cards[2][0])) count++;
		else if(!strcmp(cards[0][0],cards[2][0])) count++;

		for(int i=0;i<cards_len;i++){
			answer += atoi(cards[i][1]);
		}
	
    if(count>=3)
			answer*=3;
		else if(count>=1)
			answer*=2;

    return answer;
}
int main() {
    char* cards1[][2] = {{"blue", "2"}, {"red", "5"}, {"black", "3"}};
    int cards_len1 = 3;
    int ret1 = solution(cards1, cards_len1);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret1);

    char* cards2[][2] = {{"blue", "2"}, {"blue", "5"}, {"black", "3"}};
    int cards_len2 = 3;
    int ret2 = solution(cards2, cards_len2);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret2);
}

 

 

 

 

 

 

코드 분석

단계 과정
main 뽑은 카드의 색과 숫자를 문자열로 담은 2차원 배열 cards과 그 길이를 선언한다.
solution함수를 호출한다.
solution 카드게임의 총점을 저장할 변수 answer를 선언한다.
같은 색의 카드가 몇개인지를 저장할 변수 count를 선언한다.
solution - if  strcmp함수를 사용하여 색깔의 문자열을 서로 비교한다.

if(!strcmp(cards[0][0],cards[1][0])) count++;
else if(!strcmp(cards[1][0],cards[2][0])) count++;
else if(!strcmp(cards[0][0],cards[2][0])) count++;

이때 strcmp(문자열1, 문자열2)에서 두 문자열이 같으면 0을 반환하는데, c언어에서 0은 false를 의미하므로 not연산자(!)를 사용하여 같을때(!0 -> true) count++를 진행하도록 한다.

solution - for cards의 길이만큼 반복한다.
atoi함수를 사용하여 문자열로 되어있는 각 카드의 점수를 int형으로 변환한다.
answer변수에 각 카드의 점수를 누적시킨다.

이 과정없이 (int)cards[i][1] 등으로 작성할 경우 쓰레기값 출력
solution if문을 사용하여 count가 3일때(모든 카드의 색이 같을 때) answer에 3을 곱한다.
count가 1 이상일 때(2개의 카드가 같은 색일 때) answer에 2를 곱한다.

이후 answer를 return한다.
main 결과값(answer) ret를 출력한 후 프로그램을 종료한다.

 

 

 

 

 

 

 

 

 


 

 

GroomEdu

 

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

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

edu.goorm.io

 

댓글