1. 문제

7682번: 틱택토



2. 개요

틱택토 게임판의 상태가 주어진다.

항상 X가 O보다 먼저 시작한다고 할 때, 주어진 상태가 틱택토 게임에서 발생 가능한 최종 상태인지를 판별하는 문제.



3. 풀이 및 코드

3-1. 풀이

먼저 틱택토 게임에서 발생 가능한 최종 상황은 3가지이다.

  1. X의 승리
  2. O의 승리
  3. 무승부

X는 항상 수를 먼저 두기 때문에 X의 승리로 게임이 끝났을 때 놓여진 X의 수는 놓여진 O의 수 + 1이 된다.

반대로 O가 이겼을 경우는 항상 X의 수와 O의 수가 같게 된다.

또한 비겼을 경우에는 게임판의 모든 9개의 영역이 X와 O로 채워지게 되고 X가 5개 O가 4개 놓여지게 된다.

가로 세로 대각선으로 동일한 문자가 모여있을 때, 위의 조건과 같이 확인하여 현재 주어진 게임판의 상태가 발생 가능한 상태인지 판별하여 답을 출력하면 된다.

3-2. Python

import sys

while True:
    result = sys.stdin.readline().rstrip()

    if result == 'end':
        break

    xcount = 0
    ocount = 0

    for r in result:
        if r == "X":
            xcount += 1

        elif r == "O":
            ocount += 1

    board = []
    xwin = False
    owin = False

    for i in range(3):
        if result[i] + result[i+3] + result[i+6] == "XXX":
            xwin = True

        elif result[i] + result[i+3] + result[i+6] == "OOO":
            owin = True

        if result[i*3] + result[i*3+1] + result[i*3+2] == "XXX":
            xwin = True

        elif result[i*3] + result[i*3+1] + result[i*3+2] == "OOO":
            owin = True

    if result[0] + result[4] + result[8] == "XXX":
        xwin = True

    elif result[2] + result[4] + result[6] == "XXX":
        xwin = True

    if result[0] + result[4] + result[8] == "OOO":
        owin = True

    elif result[2] + result[4] + result[6] == "OOO":
        owin = True

    if xwin and owin:
        print("invalid")

    elif xwin:
        if xcount == ocount + 1:
            print("valid")

        else:
            print("invalid")

    elif owin:
        if xcount == ocount:
            print("valid")
        
        else:
            print("invalid")

    else:
        if xcount + ocount == 9 and xcount == ocount + 1:
            print("valid")

        else:
            print("invalid")

3-3. C#

namespace boj_7682
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new(Console.OpenStandardInput());
            StreamWriter sw = new(Console.OpenStandardOutput());

            while (true)
            {
                string result = sr.ReadLine().TrimEnd();

                if (result == "end")
                {
                    sw.Close();
                    break;
                }
                    

                int xcount = 0;
                int ocount = 0;

                foreach (char c in result)
                {
                    if (c == 'X')
                        xcount++;

                    else if (c == 'O')
                        ocount++;
                }

                bool xwin = false;
                bool owin = false;

                for (int i = 0; i < 3; i++)
                {
                    if (string.Join("", result[i], result[i + 3], result[i + 6]) == "XXX")
                        xwin = true;

                    else if (string.Join("", result[i], result[i + 3], result[i + 6]) == "OOO")
                        owin = true;

                    if (string.Join("", result[i * 3], result[i * 3 + 1], result[i * 3 + 2]) == "XXX")
                        xwin = true;

                    else if (string.Join("", result[i * 3], result[i * 3 + 1], result[i * 3 + 2]) == "OOO")
                        owin = true;
                }

                if (string.Join("", result[0], result[4], result[8]) == "XXX")
                    xwin = true;

                else if (string.Join("", result[2], result[4], result[6]) == "XXX")
                    xwin = true;

                if (string.Join("", result[0], result[4], result[8]) == "OOO")
                    owin = true;

                else if (string.Join("", result[2], result[4], result[6]) == "OOO")
                    owin = true;

                if (xwin && owin)
                    sw.WriteLine("invalid");

                else if (xwin)
                {
                    if (xcount == ocount + 1)
                        sw.WriteLine("valid");
                    else
                        sw.WriteLine("invalid");
                }

                else if (owin)
                {
                    if (xcount == ocount)
                        sw.WriteLine("valid");
                    else
                        sw.WriteLine("invalid");
                }

                else
                {
                    if (xcount + ocount == 9 && xcount == ocount + 1)
                        sw.WriteLine("valid");
                    else
                        sw.WriteLine("invalid");
                }
            }
        }
    }
}

Comments