[ BOJ / Python ] 16571번 알파 틱택토

황승환·2022년 8월 11일
0

Python

목록 보기
433/498


이번 문제는 백트레킹을 통해 해결하였다. 매번 대각선과 가로 세로를 확인하여 이전 차례의 상대의 글자가 일자로 배열해 있는지 확인한다. 그리고 여기서 나오는 결과를 통해 -1, 0, 1 중 하나를 반환하도록 한다. 수가 클 수록 좋은 경우로 배치하였기 때문에 -1, 0, 1은 L, D, W 순으로 매칭된다.

Code

grid = [list(map(int, input().split())) for _ in range(3)]
x, o = 0, 0
blanks = []
me = 0
for i in range(3):
    for j in range(3):
        if grid[i][j] == 1:
            x += 1
        if grid[i][j] == 2:
            o += 1
        if grid[i][j] == 0:
            blanks.append((i, j))
if x == o:
    me = 1
else:
    me = 2
def chk(turn):
    if turn == 1:
        before = 2
    else:
        before = 1
    if (grid[0][0] == grid[1][1] == grid[2][2] == before) or (grid[0][2] == grid[1][1] == grid[2][0] == before):
        return True
    for i in range(3):
        if (grid[i][0] == grid[i][1] == grid[i][2] == before) or (grid[0][i] == grid[1][i] == grid[2][i] == before):
            return True
    return False
def tic_tac_toe(cur):
    if cur == 1:
        nxt = 2
    else:
        nxt = 1
    mn = 2
    if chk(cur):
        return -1
    for i in range(3):
        for j in range(3):
            if grid[i][j] == 0:
                grid[i][j] = cur
                mn = min(mn, tic_tac_toe(nxt))
                grid[i][j] = 0
    if mn == 1:
        return -1
    elif mn == 2 or mn == 0:
        return 0
    else:
        return 1
if not blanks:
    print('D')
else:
    answer = tic_tac_toe(me)
    if answer == 1:
        print('W')
    elif answer == 0:
        print('D')
    else:
        print('L')

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글