알고리즘/백준

백준 9655번 (돌 게임) c++

Jo_Wick 2022. 12. 27. 16:28

문제

문제 풀이

문제의 조건을 제대로 파악해야 한다.

1. 둘 다 각각의 차례에 1개 또는 3개를 가져갈 수 있다.

2. 두 사람이 완벽하게 게임을 플레이 한다.

3. 게임은 상근이가 먼저 시작한다.

 

N = 1             N = 2           N = 3           N = 4         N = 5        N = 6

 SK                  CY              SK               CY             SK            CY

 

이렇게 각 N에 따라 답은 정해져 있다.

규칙을 보자면 짝수일 때, 홀수일 때 각각 답이 같은 것을 알 수 있다.

 

그래서 단순히 홀수, 짝수를 판별해 답을 도출할 수 있다.

 

전체 코드

#include <bits/stdc++.h>

using namespace std;

int main(){

        ios_base::sync_with_stdio(false);
        cin.tie(0);

        int N;

        cin >> N;

        if(N & 1){
                cout << "SK\n";
        }
        else cout << "CY\n";

        return 0;

}

 

하지만 이 문제를 DP(Dynamic Programing)으로도 풀 수 있다.

예를 들어 N에서 1개 혹은 3개를 가져갈 수 있다.

그래서 N개의 결과는, N - 1 or N - 3의 경우일때의 결과와 반대의 경우로 설정을 해주면 된다. (물론 N - 1 이나 N - 3의 결과는 동일하다.)

나는 단순히 N - 1의 경우만을 고려하여 답을 출력했다.

 

전체코드

#include <bits/stdc++.h>

using namespace std;

int main(){

        ios_base::sync_with_stdio(false);
        cin.tie(0);

        int N;

        cin >> N;

        bool dp[1001] = {0,};

        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 0;
        dp[3] = 1;

        for(register int i = 4; i <= N; i++){
                dp[i] = !dp[i-1];
        }

        if(dp[N]){
                cout << "SK\n";
        }

        else cout << "CY\n";


        return 0;

}