문제 설명 및 제한사항
아이디어 및 해결 방법
코드
MOVES = [[0, 1], [0, -1], [1, 0], [-1, 0]]
INF = 1e9
def is_valid(board, loc):
    return 0 <= loc[0] < len(board) and \
		0 <= loc[1] < len(board[0]) and \
		(board[loc[0]][loc[1]] != 0)
def lost(board, loc):
    return board[loc[0]][loc[1]] == 0 or \
		all(not is_valid(board, [loc[0] + r, loc[1] + c]) for r, c in MOVES)
def copy(board):
    return [row[:] for row in board]
def solve(board, aloc, bloc, turn, depth):
    if turn == 0 and lost(board, aloc):
        return 1, depth
    
    elif turn == 1 and lost(board, bloc):
        return 0, depth
    
    myloc = aloc if turn == 0 else bloc
    # 내가 이기는 결과라면 최소의 depth를 가져야 하고,
    # 내가 지는 결과라면 최대의 depth를 가져야 한다.
    
    min_depth, max_depth = INF, -1
    for r, c in MOVES:
        # 새로운 board를 만든다.
        newboard = copy(board)
        newboard[myloc[0]][myloc[1]] = 0
        
        # 새로운 위치를 만든다.
        newloc = [myloc[0] + r, myloc[1] + c]
        if not is_valid(newboard, newloc):
            continue
        new_aloc = newloc if turn == 0 else aloc
        new_bloc = bloc if turn == 0 else newloc
        winner, d = solve(newboard, new_aloc, new_bloc, 1-turn, depth+1)
        if winner == turn:
            min_depth = min(min_depth, d)
        else:
            max_depth = max(max_depth, d)
        
    if min_depth != INF:
        return turn, min_depth
    else:
        return 1-turn, max_depth
            
def solution(board, aloc, bloc):
    winner, n_moves = solve(board, aloc, bloc, 0, 0)
    print(winner, n_moves)
    return n_moves
Python
복사
출처
프로그래머스 코딩테스트 연습 https://school.programmers.co.kr/learn/challenges