도면의 상태를 나타내는 2차원 배열 board가 매개변수로 주어질 때, 경주로를 건설하는데 필요한 최소 비용을 return하도록 solution 함수를 완성해주세요.
너비우선탐색 + dp
dp = [상하로 들어온 가중치, 좌우로 들어온 가중치]
def solution(board):
answer, m, n = 0, len(board), len(board[0])
INF = int(1e9)
q = list()
dp = [[[INF,INF] for _ in range(n)] for _ in range(m)]
q.append([0, 0, 0, 0])
q.append([0, 0, 0, 1])
dp[0][0] = [0,0]
dx = [-1,0,1,0]
dy = [0,1,0,-1]
while q:
cost, x, y, pos = q.pop(0)
for dir in range(4):
nx, ny = x + dx[dir], y + dy[dir]
if 0<=nx<m and 0<=ny<n and board[nx][ny] != 1:
if pos == 0: # 위 또는 아래에서 온 경우
new_cost = cost + (100 if dir % 2 == 0 else 600)
else: # 왼쪽 또는 오른쪽에서 온 경우
new_cost = cost + (600 if dir % 2 == 0 else 100)
if dp[nx][ny][dir%2] > new_cost:
dp[nx][ny][dir%2] = new_cost
q.append([new_cost, nx, ny, dir % 2])
return min(dp[m-1][n-1])