틱택토
🔍 알고리즘 분류
💡 문제 풀이
dfs/백트래킹으로 가능한 말의 조합 모두 생성
turn을 인자로 줘서 홀수면 X, 짝수면 O로 놓기
turn이 10이면 더 이상 놓을 수 없으므로 종료
- 한 말로
3칸 연결되면 (2) 종료
3칸 연결 확인
가로 확인
- 전치 행렬로 변환해서
세로 확인
- 두
대각선 확인
set에 가능한 모든 조합 저장 후 입력 받을 때마다 set에 있는지 확인
📄 코드
def check_line(c):
for row in board:
if row.count(c) == 3:
return True
transform_board = [list(row) for row in zip(*board)]
transform_board = tuple(map(tuple, transform_board))
for row in transform_board:
if row.count(c) == 3:
return True
for i, j in zip(range(3), range(3)):
if board[i][j] != c:
break
else:
return True
for i, j in zip(range(3), range(2, -1, -1)):
if board[i][j] != c:
break
else:
return True
def dfs(turn):
if check_line('O') or check_line('X'):
forms.add(tuple(map(tuple, board)))
return
if turn == 10:
forms.add(tuple(map(tuple, board)))
return
for i in range(3):
for j in range(3):
if board[i][j] == '.':
board[i][j] = 'X' if turn % 2 == 1 else 'O'
dfs(turn + 1)
board[i][j] = '.'
board = [['.'] * 3 for _ in range(3)]
forms = set()
dfs(1)
while True:
s = input()
if s == "end":
break
arr = []
for i in range(0, 8, 3):
arr.append(list(s[i:i+3]))
arr = tuple(map(tuple, arr))
if arr not in forms:
print("invalid")
else:
print("valid")