https://programmers.co.kr/learn/courses/30/lessons/67259
def solution(board):
answer = [float('inf')]
visited = [[False] * len(board) for _ in range(len(board))]
visited[0][0] = True
min_cost = [[float('inf')] * len(board) for _ in range(len(board))]
min_cost[0][0] = 0
dfs(board, visited, min_cost, answer, (0, 0, -1, 0))
return answer[0]
def dfs(board, visited, min_cost, answer, curr):
dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
cy, cx, cd, cost = curr
# 종료 조건
if cy == cx == len(board) - 1:
if answer[0] > cost:
answer[0] = cost
return
# 인접 좌표 탐색
for nd in range(4):
ny, nx = cy + dy[nd], cx + dx[nd]
if not (0 <= ny < len(board) and 0 <= nx < len(board)):
continue
if board[ny][nx] or visited[ny][nx]:
continue
visited[ny][nx] = True
# 직선
if cd < 0 or cd == nd:
if min_cost[ny][nx] >= cost + 100:
min_cost[ny][nx] = cost + 100
dfs(board, visited, min_cost, answer, (ny, nx, nd, cost + 100))
# 코너
else:
if min_cost[ny][nx] >= cost + 600:
min_cost[ny][nx] = cost + 600
dfs(board, visited, min_cost, answer, (ny, nx, nd, cost + 600))
visited[ny][nx] = False