오늘의 알고리즘
[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가 승리해야 합니다.
이외의 갯수차이라면 불가능합니다.
이것을 찾아내는 게 관권이었습니다.