[BAEKJOON] 백준 9657: 돌 게임 3 (C#)

2024. 6. 20. 20:50IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/9657

 

 

문제

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

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

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

 

 

입력

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

 

 

출력

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

 

 

 

통과한 답안

namespace _9657
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            bool[] dp = new bool[N + 1];

            dp[0] = false;
            if (N >= 1) dp[1] = true;
            if (N >= 2) dp[2] = false;
            if (N >= 3) dp[3] = true;
            if (N >= 4) dp[4] = true;

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

            Console.WriteLine(dp[N] ? "SK" : "CY");

        }
    }
}

 

두 명이서 번갈아서 돌을 가져가는데, 1개 혹은 3개 혹은 4개를 가져갈 수 있다.

마지막에 돌을 가져가는 사람이 이기게 된다.

상근이가 먼저 시작하여 상근이가 이기면 SK, 창영이가 이기면 CY를 출력하는 문제이다.

 

이 문제의 경우에는 4개가 추가되었기 때문에 DP를 사용해서 풀이하는 것이 좋은데

돌이 0개 혹은 2개가 남아있다면 이길 수 없고,

1개, 3개, 4개가 남아있다면 이길 수 있다.

 

따라서 0부터 4까지는 위와 같이 승패를 결정한 뒤에

5부터는 for 문을 이용해서 DP를 구현하였는데,

dp[i]는 dp[i - 1], dp[i - 3], dp[i - 4] 중 하나라도 false가 있다면 true가 된다.

다시 말해서 현재 차례에서 1개, 3개, 4개를 가져갔을 때

한 경우라도 상대방이 지는 경우가 나오면 현재 플레이어가 이기게 된다.