STUDY/알고리즘

[백준 S5] 돌 게임 (9655번)

ME74 2021. 4. 26. 01:28

www.acmicpc.net/problem/9655

 

9655번: 돌 게임

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

www.acmicpc.net

문제

돌 게임은 두 명이서 즐기는 재밌는 게임이다.

탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개 또는 3개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.

두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)

출력

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

소스코드 및 풀이

#include <iostream>

using namespace std;

#define MAX 1001

bool res[MAX];

void preprocess(void)
{
    res[1] = true;
    res[3] = true;

    for(int i=4; i<=1000; ++i) {
        res[i] = !res[i-1] || !res[i-3];
    }
}

int main(void)
{
    preprocess();

    int N;
    cin >> N;
    
    if(res[N])
        cout << "SK" << endl;
    else   
        cout << "CY" << endl;
    return 0;
}

* 예전에 많이 풀었던 win-lose tree 문제인데 재귀호출로 풀었더니 시간초과가 났다.

* DP를 사용해서 미리 결과를 저장해두면 시간초과를 피할 수 있다.