https://school.programmers.co.kr/learn/courses/30/lessons/169199
from collections import deque
def solution(board):
def up(x, y):
while True:
if x == -1 or board[x][y] == 'D':
return x+1, y
else:
x -= 1
def down(x, y):
while True:
if x == N or board[x][y] == 'D':
return x-1, y
else:
x += 1
def left(x, y):
while True:
if y == -1 or board[x][y] == 'D':
return x, y+1
else:
y -= 1
def right(x, y):
while True:
if y == M or board[x][y] == 'D':
return x, y-1
else:
y += 1
N, M = len(board), len(board[0])
maps = [[False] * M for _ in range(N)]
q = deque()
for i in range(N):
for j in range(M):
if board[i][j] == 'R':
q.append((i, j, 0))
if board[i][j] == 'G':
end_x, end_y = i, j
while q:
x, y, cnt = q.popleft()
for i in range(4):
if i == 0:
nx, ny = up(x, y)
elif i == 1:
nx, ny = down(x, y)
elif i == 2:
nx, ny = left(x, y)
elif i == 3:
nx, ny = right(x, y)
if not maps[nx][ny]:
maps[nx][ny] = cnt+1
q.append((nx, ny, cnt+1))
if maps[end_x][end_y]:
return maps[end_x][end_y]
else:
return -1
일반적인 상하좌우 방향으로 한 칸씩 이동하는 BFS 문제에서 이동 조건만 변경된 문제이다.