1. 문제

혼자서 하는 틱택토



2. 개요

선공이 ‘O’, 후공이 ‘X’ 로 표시된 3 x 3 크기의 틱택토 보드가 주어진다.

주어진 틱택토 보드의 게임 상황이 가능한 경우라면 1을, 그렇지 않다면 0을 리턴하는 문제.



3. 풀이 및 코드

3-1. 풀이

틱택토는 항상 선공이 먼저 수를 두게 되어있는 게임이다. 이 점을 이용하여 현재 상황이 가능한지 아닌지를 판단할 수 있다.

게임 상황은 크게 세 가지로 나눌 수 있다.

  1. 아직 승부가 나지 않은 경우.
  2. 선공이 승리한 경우.
  3. 후공이 승리한 경우.

첫 번째 경우인 아직 승부가 나지 않은 경우에는 선공의 돌이 후공의 돌보다 한 개 더 많거나 두 돌의 수가 같아야만 한다.

선공이 승리한 경우에는 선공이 돌을 두고 게임이 끝났으므로 항상 후공보다 돌이 한 개 더 많아야 한다.

후공이 승리한 경우에는 반대로 후공의 차례에 게임이 끝난 것이므로 두 돌의 수가 같아야만 한다.

따라서 각 돌의 수와 선공의 승/패 여부를 파악하여 위 조건에 맞게 조건문을 작성 후 최종적인 답을 리턴해주면 된다.

3-2. C#

using System;

public class Solution {
    public int solution(string[] board) {
            int answer = Chk(board) ? 1 : 0;

            return answer;
        }

        bool Chk(string[] board)
        {
            int firstCnt = 0;
            int afterCnt = 0;

            for (int i = 0; i < board.Length; i++)
            {
                for (int j = 0; j < board[i].Length; j++)
                {
                    if (board[i][j] == 'O')
                        firstCnt++;

                    else if (board[i][j] == 'X')
                        afterCnt++;
                }
            }

            if (afterCnt > firstCnt || firstCnt > afterCnt + 1)
                return false;
            
            if (firstCnt != afterCnt + 1 && ChkFirstWin(board))
                return false;

            if (firstCnt != afterCnt && ChkFirstLose(board))
                return false;

            return true;
        }
    
        bool ChkFirstWin(string[] board)
        {
            for (int i = 0; i < 3; i++)
            {
                if (board[i][0] == 'O' && board[i][1] == 'O' && board[i][2] == 'O')
                    return true;

                if (board[0][i] == 'O' && board[1][i] == 'O' && board[2][i] == 'O')
                    return true;
            }

            if (board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O')
                return true;

            if (board[0][2] == 'O' && board[1][1] == 'O' && board[2][0] == 'O')
                return true;

            return false;
        }

        bool ChkFirstLose(string[] board)
        {
            for (int i = 0; i < 3; i++)
            {
                if (board[i][0] == 'X' && board[i][1] == 'X' && board[i][2] == 'X')
                    return true;

                if (board[0][i] == 'X' && board[1][i] == 'X' && board[2][i] == 'X')
                    return true;
            }

            if (board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X')
                return true;

            if (board[0][2] == 'X' && board[1][1] == 'X' && board[2][0] == 'X')
                return true;

            return false;
        }
}

Comments