from collections import deque
def solution(board):
answer = 0
board = [list(_) for _ in board]
row, col = len(board), len(board[0])
res = [[0 for i in range(len(board[0]))] for j in range(len(board))]
d = [(0, 1), (1, 0), (-1, 0), (0, -1)]
q = deque()
def slide(i,j,dr,dc):
while True:
ci,cj = i + dr, j + dc
if not (0 <= ci < row and 0 <= cj < col) or board[ci][cj] == 'D':
return ci-dr, cj-dc
i,j=ci,cj
for i in range(row):
for j in range(col):
if board[i][j]== 'R':
q.append((i,j,0))
while q:
cx, cy, dist = q.popleft()
res[cx][cy]=dist
if(board[cx][cy]=='G'):
answer=dist
break
for dr , dc in d:
nx,ny=slide(cx,cy,dr,dc)
if(res[nx][ny]==0):
res[nx][ny]=1
q.append((nx,ny,dist+1))
if(answer==0):
return -1
else:
return answer
풀이
리코쳇 로봇 최소 경로 찾기
문자열을 리스트화 시켜준다.
시작지점 R 부터 목적지 G 지점까지 도달하는 경로를 찾는다.
BFS를 사용한다.
한칸씩 이동시키는 것이 아닌 slide 함수를 사용해서 진행방향에 벽 혹은 끝까지 진행하는 좌표를 얻는다.
해당 좌표를 지나간적이 없으면 q에 추가해준다.
만약 현재 좌표가 ‘G’면 answer에 거리를 추가한다
모든 탐색이 끝난 후 answer이 0인 경우에는 경로를 못찾은것이기 때문에 -1을 아니면 answer을 출력한다.