[백준] 7682 - 틱택토
1. 문제
2. 개요
틱택토 게임판의 상태가 주어진다.
항상 X가 O보다 먼저 시작한다고 할 때, 주어진 상태가 틱택토 게임에서 발생 가능한 최종 상태인지를 판별하는 문제.
3. 풀이 및 코드
3-1. 풀이
먼저 틱택토 게임에서 발생 가능한 최종 상황은 3가지이다.
- X의 승리
- O의 승리
- 무승부
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