728x90
728x90

문제 링크 : https://www.acmicpc.net/problem/20154

 

 

문제

가톨릭대학교에 다니는 컴퓨터정보공학부 황톨릭은 코로나 때문에 슬퍼하는 친구들을 위해 게임을 하나 만들었다.

게임이 시작되면 알파벳 대문자로만 이루어진 문자열이 주어진다. 문자열이 주어지면 각 문자의 획수로 문자를 변환한다. 획수들을 갖고 앞에서부터 두 개씩 더해가는데 만약 짝이 지어지지 않는다면 그대로 다음 단계로 내려간다. 다음 단계부터는 이전 단계에서 두 개씩 더해가며 생성된 숫자들을 가지고 같은 과정을 반복한다. 과정을 반복하다가 결국 마지막 한 개의 수가 남았을 때 그 수가 홀수라면 이기는 것이고 짝수라면 지는 게임이다!!

예를 들어 "ABCDE"라는 문자열이 주어지면 ‘A’, ‘B’, ‘C’, ‘D’, ‘E’ 각 문자의 획수인 3, 2, 1, 2, 3으로 바꾸어 아래의 그림처럼 과정을 진행한다. 단, 계산할 때, 더한 값이 10을 넘는다면 10으로 나눈 나머지로 바꿔준다.

‘E’의 경우는 짝을 지을 수 없으므로 3이 바로 내려오게 된다. 결국, 마지막 남은 수가 1인 홀수이므로 이 게임은 이기게 되는 것이다.

게임의 심판역할인 톨릭이는 매번 계산하는 게 귀찮아 코드를 짜놓고 싶어한다. 톨릭이를 도와 코드를 짜주자!!

알파벳 대문자의 획수는 아래 표와 같다.

 

 


 

접근 방법

 

계산의 편의를 위해서 int, string, char를 적절하게 변환해야 하는 문제였다.

 

char -> int  : char에 '0'을 빼주면된다.
int or char -> string  : to_string()를 쓰면 된다.

 

알고리즘은 아래 단계와 같다.

 

1) 획수를 alpha[] 에 차례로 저장한다.

2) 입력 문자열에 대한 획수를 alpha[]에서 구한 다음, 그 획수를 string 형으로 바꿔서 쭉 붙이고 cntStr에 저장한다. 즉, 입력문자열이 "ABCDE" 면 cntStr는 "32123"이 저장된다.

3) cntStr의 길이가 1이 될 때까지 while문을 반복한다.

    3)-1. 획수가 쭉 이어져 있는 문자열인 cntStr를 따라가면서 짝지어서 획수를 더해서 계산한다.

    3)-2. 그 계산 값을 문자열 tmp에 'push_back()함수' 또는 '+=' 연산을 이용해서 붙여준다. 

    3)-3. 짝이 안 맞는 수가 하나 남으면 마지막에 tmp에 그대로 이어 붙여준다.

 

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;

int alpha[26] = {3,2,1,2,3,3,3,3,1,1,3,1,3,3,1,2,2,2,1,2,1,1,2,2,2,1};
int main(){
    
    string str; cin >> str;

    string cntStr = "";
    for(int i = 0; i<str.length(); i++){
        cntStr += to_string(alpha[str[i]-65]);
    }   

    while(cntStr.length()>1){
        int len = cntStr.length();
        if(len == 1) break;

        string tmp = "";
        if(len % 2 != 0)
        { //짝 안 맞는게 하나 있을 때
            for(int i = 0; i<len-1; i+=2){  
                int num = ((cntStr[i]-'0') + (cntStr[i+1]-'0'))%10;
                tmp += to_string(num);
                
            }
            tmp.push_back(cntStr[len-1]);
            cntStr = tmp;
        }
        else
        { //모두 짝이 맞을 때
            for(int i = 0; i<len; i+=2){   
                int num = ((cntStr[i] - '0') + (cntStr[i + 1] - '0')) % 10;
                tmp += to_string(num);
            }
            cntStr = tmp;
        }
    }

    int res = cntStr[0] - '0';
    if(res % 2 != 0) {
        cout << "I'm a winner!";
    }
    else{
        cout << "You're the winner?";
    }



    return 0;
}

 

 

 

728x90

+ Recent posts