코딩테스트 연습 - 경주로 건설 | 프로그래머스 (programmers.co.kr)
def solution(board):
answer = 0
# 아래 방향으로 시작하는 경우
down_x_dir = [-1, 1, 0, 0]
down_y_dir = [0, 0, -1, 1]
queue = []
# 시작 x, 시작 y, 방향, 가격
queue.append((0, 0, 1, 0))
# x,y에 도착했을 때 turn해서 왔는지는 따로 저장
price = [[[1e9 for _ in range(2)] for _ in range(len(board[0]))] for _ in range(len(board))]
price[0][0][0] = 0
price[0][0][1] = 0
while queue:
x, y, d, v = queue.pop(0)
for i in range(4):
nx = x + down_x_dir[i]
ny = y + down_y_dir[i]
if nx < 0 or ny < 0 or nx >= len(board) or ny >= len(board):
continue
if board[nx][ny] == 1:
continue
isturn = 0
if i != d:
isturn = 1
value = v + 100
if isturn:
value += 500
if price[nx][ny][isturn] < value:
continue
price[nx][ny][isturn] = value
queue.append((nx, ny, i, value))
# 오른쪽 방향으로 시작하는 경우
right_x_dir = [0, 0, -1, 1]
right_y_dir = [-1, 1, 0, 0]
queue = []
queue.append((0, 0, 1, 0))
while queue:
x, y, d, v = queue.pop(0)
for i in range(4):
nx = x + right_x_dir[i]
ny = y + right_y_dir[i]
if nx < 0 or ny < 0 or nx >= len(board) or ny >= len(board):
continue
if board[nx][ny] == 1:
continue
isturn = 0
if i != d:
isturn = 1
value = v + 100
if isturn:
value += 500
if price[nx][ny][isturn] < value:
continue
price[nx][ny][isturn] = value
queue.append((nx, ny, i, value))
answer = min(price[len(board)-1][len(board)-1][0], price[len(board)-1][len(board)-1][1])
return answer
'알고리즘' 카테고리의 다른 글
[BOJ] 1967 트리의 지름 - 그래프 이론, 다익스트라 (0) | 2020.11.02 |
---|---|
[BOJ] 1918 후위표기식 - 문자열, 스택 (0) | 2020.11.02 |
[BOJ] 2668 단지번호붙이기 - dfs, graph (0) | 2020.11.01 |
[BOJ] 1786 찾기 - kmp알고리즘 (0) | 2020.10.29 |
[BOJ] 1629 곱셈 - 분할정복 (0) | 2020.10.29 |