# 백준 7682 틱택토
# 꽉 차있는지...
# o이 x보다 많으면 안되고..
# 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는 데 성공
# 게임판이 가득 찼을 때
while True:
game = input()
if game == "end":
break
else:
lst = [game[0:3], game[3:6], game[6:9]] # lst에 가로, 세로, 대각선 모든 경우를 넣는다.
for i in range(3):
word = ''
for j in range(3):
word += lst[j][i]
lst.append(word)
lst.append(lst[0][0] + lst[1][1] + lst[2][2])
lst.append(lst[0][2] + lst[1][1] + lst[2][0])
if '.' in game: # 게임판에 빈 칸이 있는 경우
if game.count('X') == game.count('O'): # O을 마지막에 냈을 경우
if lst.count('OOO') > 1 or lst.count('XXX') > 1: # 3칸을 잇는 경우가 여러개일 경우 끝나야 하는데 끝나지 않았기 때문에
print('invalid')
elif lst.count('XXX') == 1:
print('invalid')
elif lst.count('OOO') == 1:
print('valid')
else:
print('invalid')
elif game.count('X') == game.count('O') + 1: # x를 마지막에 낸 경우
if lst.count('OOO') > 1 or lst.count('XXX') > 1: # 3칸을 잇는 경우가 여러개일 경우 끝나야 하는데 끝나지 않았기 때문에
print('invalid')
elif lst.count('OOO') == 1: # x를 마지막에 냈지만 이미 o 3칸이 존재하면 invalid
print('invalid')
elif lst.count('XXX') == 1: # x를 마지막에 내고 x 3칸이 1개 존재할 경우
print('valid')
else:
print('invalid')
else: # 아무도 안 냈을 경우
print('invalid')
else: # 게임판이 꽉 찬 경우
if game.count('X') == 5 and game.count('O') == 4:
if lst.count('OOO') == 1: # 게임판 꽉 차있을 때 'O'가 이기는 경우 invalid
print('invalid')
else:
print('valid')
else:
print('invalid')
게임이 끝나는 경우는
이 2가지 경우이다.
그래서 먼저 lst에 주어진 게임판의 가로,세로, 대각선의 값을 모두 넣어놓았다.
그 후 게임판이 꽉 찬 경우와, 그렇지 않은 경우로 나누어
1. 게임판이 꽉 찬 경우
이 2개의 경우를 확인해 주었고
2. 게임판이 꽉 차지 않은 경우
를 확인해 주었다.
조건이 생각보다 복잡해 이해하는데에 오래 걸렸지만 조건을 잘 이해하고 작성한다면 그렇게 어렵지는 않은 문제였던 것 같다!