오늘의 알고리즘

[C++] 백준 7682 틱택토

하늘하늘 . 2022. 7. 18. 20:53
 
#include <iostream>
#include <string>
#include <algorithm>
 
int arr[3][3];
 
int check(char c)
{
    int iCount = 0;
 
    for (int i = 0; i < 3; ++i)
    {
        if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])
        {
            if (arr[i][0] == c)
                ++iCount;
        }
 
        if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])
        {
            if (arr[0][i] == c)
                ++iCount;
        }
    }
 
    if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])
    {
        if (arr[1][1] == c)
            ++iCount;
    }
 
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
    {
        if (arr[1][1] == c)
            ++iCount;
    }
 
    return iCount;
}
 
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
 
    while (true)
    {
        std::string s = {};
        std::cin >> s;
 
        if (s[0] == 'e')
            return 0;
 
        int iX = 0;
        int iO = 0;
        int iCount = 0;
        int iRemain = 0;
        bool bAvail = true;
 
        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                arr[i][j] = s[iCount++];
 
                if (arr[i][j] == '.')
                    ++iRemain;
 
                else if (arr[i][j] == 'X')
                    ++iX;
 
                else if (arr[i][j] == 'O')
                    ++iO;
            }
        }
 
        if (!iRemain)
        {
            if (iX != iO + 1)
                bAvail = false;
 
            int iResult = check('O');
 
            if (iResult > 0)
                bAvail = false;
        }
 
        else if (iRemain % 2 == 0 && iRemain != 0)
        {
            if (iX != iO + 1)
                bAvail = false;
 
            int iResult = check('O');
 
            if (iResult > 0)
                bAvail = false;
 
            iResult = check('X');
 
            if (!iResult)
                bAvail = false;
        }
 
        else
        {
            if (iX != iO)
                bAvail = false;
 
            int iResult = check('X');
 
            if (iResult > 0)
                bAvail = false;
 
            iResult = check('O');
 
            if (!iResult)
                bAvail = false;
        }
 
        if (bAvail)
            std::cout << "valid" << "\n";
        else
            std::cout << "invalid" << "\n";
    }
 
    return 0;
}

구현 문제

O가 승리할 때와 X가 승리할 때를 구분짓는 게 중요했습니다.

.이 없을 경우에는 무조건 X의 승리여야하고 (5 : 4) X승리가 2개이어도 괜찮지만 (OOXOOXXXX 경우)

나머지의 경우는 X승리나 O승리가 2개라면 문제가 되었습니다.

 

X의 갯수가 1개가 더많다면 무조건 X승리,

갯수가 같다면 O가 승리해야 합니다.

이외의 갯수차이라면 불가능합니다.

 

이것을 찾아내는 게 관권이었습니다.