Lv2 프로그래머스(Programmers)[Python][파이썬] 리코쳇 로봇

"""
출처:프로그래머스,
https://school.programmers.co.kr/learn/courses/30/lessons/169199
"""
# 풀이 과정
def solution(board):
from collections import deque

check = deque()
finish = []

m, n = len(board), len(board[0])

check_board = [[" "] * n for k in range(m)] # 최소 거리를 담는 보드

for x in range(len(board)): # 출발 및 목적지 위치 확인
for y in range(len(board[0])):
if board[x][y] == "R":
check.append([x, y, 0])
if board[x][y] == "G":
finish.append([x, y])

if check and finish:
break

f_x, f_y = finish[0][0], finish[0][1]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

while check:
a, b, c = check.popleft()

for v, w in zip(dx, dy):
new_a = a
new_b = b
while True:
if 0 <= new_a + v < len(board) and 0 <= new_b + w < len(board[0]) and board[new_a + v][
new_b + w] != "D":
new_a += v
new_b += w

else:
if check_board[new_a][new_b] == " ":
check.append([new_a, new_b, c + 1])
check_board[new_a][new_b] = c + 1
break
else:
if check_board[new_a][new_b] > c + 1:
check.append([new_a, new_b, c + 1])
check_board[new_a][new_b] = c + 1
break

return -1 if check_board[f_x][f_y] == " " else check_board[f_x][f_y]