알고리즘 풀이

[C#] 백준 18939번 문제풀이

bimtaeur30 2026. 2. 23. 12:38

문제번호: 18939

문제명: 경비병 세우기 게임

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

문제내용과 예제 입/출력은 위 문제 링크에서 확인해 주시기 바랍니다

 

오늘은 처음으로 다이아 4 티어 문제를 풀었습니다. 경비병 세우기 게임이란 N과 M크기의 격자판에서 K*K정사각형들이 있을 때 모든 K*K 칸에 경비병이 1 이상 있을 경우 안전상태가 되고, Platina와 Yuto 둘 중 한 명이 먼저 안전상태를 만들 경우 이긴 사람의 이름을 출력하는 문제입니다.


문제 상황을 2가지로 나누어보았습니다.
첫번째 상황은 격자판이 너무 작아서(Math.Max(N, M) < K * 2) 먼저 경비를 하나라도 두는 사람이 이기는 경우입니다. 이 경우에는 항상 Yuto가 선이기 때문에 Yuto가 승리하게 됩니다.
두 번째 상황은 모든 격자판을 채우는 경우의 수입니다. 물론 최소의 경비만으로 안전상태를 충족시킬 수 있지만, 양쪽 플레이어는 '이기기 위한 최선의 선택'을 매번 해야 하기 때문에 안전상태를 만들 수 없도록 다른 곳에 둘 수 있고 결국에는 모든 격자판이 채워지기 전까지는 게임이 끝나지 않습니다. 그렇게 제일 마지막에 안전상태로 수를 마무리한 플레이어가 승리하게 됩니다.
다음은 정답코드입니다.

public static void Main()
{
    using StreamReader sr = new StreamReader(Console.OpenStandardInput());
    using StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

    int n = int.Parse(sr.ReadLine());
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < n; i++)
    {
        string[] input = sr.ReadLine().Split();
        long N = long.Parse(input[0]);
        long M = long.Parse(input[1]);
        long K = long.Parse(input[2]);

        if (Math.Max(N, M) < K * 2)
        {
            sb.AppendLine("Yuto");
        }
        else
        {
            if ((N * M) % 2 == 0)
            {
                sb.AppendLine("Platina");
            }
            else
            {
                sb.AppendLine("Yuto");
            }
        }
    }
    sw.Write(sb.ToString());
    sr.Close();
    sw.Close();
}




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

[C#] 백준 2467번 문제풀이  (0) 2026.02.26
[C#] 백준 2606번 문제풀이  (0) 2026.02.26
[C#] 백준 2217번 문제풀이  (0) 2026.02.22
[C#] 백준 1269번 문제풀이  (0) 2026.02.21
[C#] 백준 1026번 문제풀이  (0) 2026.02.20