치춘짱베리굿나이스

[백준] 9657 본문

C C++/알고리즘풀이

[백준] 9657

치춘 2023. 7. 12. 13:11

돌 게임 3

문제

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

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

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

입력

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

출력

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

풀이

#include <iostream>

int main(void) {
    int n;
    int dp[1001];

    std::cin >> n;

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

    for (int i = 5; i <= n; i++) {
        if (dp[i - 1] == 1 && dp[i - 3] == 1 && dp[i - 4] == 1)
            dp[i] = 0;
        else dp[i] = 1;
    }
    std::cout << (dp[n] == 1 ? "SK" : "CY") << "\n";
}

반성회

결국 DP 로 풀어버린 돌게임

  1. 돌의 개수가 1, 3, 4개일 때엔 상근이가 이기고, 2일 때엔 창영이가 이긴다
  2. 상근이가 이길 수 있는 그 다음 턴에 1, 3, 4개를 냈을 때 돌을 다 가져가게 되면 창영이가 이긴다
    • 예를 들어, 돌이 6개일 때 상근이가 이길 수 있다면, 돌이 7, 9, 10개일 때는 창영이가 이긴다는 뜻
    • 반대로 생각하면, 돌이 n-1개, n-3개, n-4개일 때 전부 상근이가 이긴다면, 돌이 n개일 때는 창영이가 무조건 이긴다
    • 돌이 n-1, n-3, n-4개일 때 중 하나라도 창영이가 이길 수 있는 여지가 있다면, 그 다음 턴인 n개 때에는 상근이가 이길 수 있다
    • 예를 들어, 돌이 2개 or 4개 or 5개일 때 모두 상근이가 이긴다면, 돌이 6개일 때는 무슨 짓을 해도 창영이가 이길 수밖에 없다는 뜻 (창영이는 게임에서 최선을 다하므로)
    • 돌이 2개 or 4개 or 5개일 때 중 하나라도 창영이가 이긴다면, 그 다음 턴에 상근이가 돌을 가져갈 수 있으므로 돌이 6개일 때 상근이가 이긴다

DP는 너무 어렵다… 사실 완벽하게 이해는 못한 것 같음

'C C++ > 알고리즘풀이' 카테고리의 다른 글

[백준] 2003  (0) 2023.07.12
[백준] 9658  (0) 2023.07.12
[백준] 9656  (0) 2023.07.11
[백준] 9655  (0) 2023.07.11
[백준] 15486  (0) 2023.07.11
Comments