반응형
from collections import deque
def solution(board):
ans = float('inf')
n = len(board)
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
# (nx, ny, d) : cost
visit = {(0,0,0):0, (0,0,1):0, (0,0,2) : 0, (0,0,3):0}
que = deque()
#초기값. x, y, dir = -1 , cost
que.append((0,0,-1,0))
#BFS
while que:
x, y, dir, cost = que.popleft()
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
#이동 가능하면 (범위내이고 board[nx][ny]가 0이면)
if -1 < nx < n and -1 < ny < n and not board[nx][ny]:
ncost = cost
#맨 처음
if dir == -1:
ncost += 100
#진행 방향 평행
elif(dir - d) % 2 == 0:
ncost += 100
#진행 방향 수직
else: ncost += 600
#도착 지점이라면 min값으로 갱신
if nx == n-1 and ny == n - 1:
ans = min(ans, ncost)
#방문하지 않았거나 || 방문 했을때보다 비용 적은 경우에 value(cost) 갱신, queue에 추가
elif visit.get((nx, ny, d)) is None or visit.get((nx,ny, d)) > ncost:
visit[(nx, ny, d)] = ncost
que.append((nx, ny, d, ncost))
return ans
if __name__ == "__main__":
board = [[0,0,0],[0,0,0],[0,0,0]]
solution(board)
728x90
반응형
'개발 > Algorithm 문제 풀이' 카테고리의 다른 글
[Python] 카카오 2018 채용 - 다트게임 (0) | 2020.08.17 |
---|---|
[Python] 카카오 2019 인턴쉽 - 인형 뽑기 게임 (0) | 2020.08.16 |
[Python] 카카오 2020 인턴쉽 코딩테스트 - 보석쇼핑 (0) | 2020.08.15 |
[C++, Python] 투 포인터 3) BOJ 1806 부분합 (0) | 2020.08.12 |
[C++, Python] 투 포인터 2) BOJ 1644 소수의 연속합 (0) | 2020.08.12 |