https://school.programmers.co.kr/learn/courses/30/lessons/169199
문제 내 예시는 아래 이미지와 같이 움직이게 되며 규칙은 아래와 같다.
만약 이해가 안된다면 아래 동영상을 꼭 보면 좋습니다!!! 동작원리를 쉽게 이해할수 있어요
https://www.youtube.com/watch?v=QqSREKrNSIg
from collections import deque
def solution(board):
n, m = len(board), len(board[0])
graph = [list(board[i]) for i in range(n)]
chk = [[float('inf')] * m for _ in range(n)]
# 시작점, 도착점 찾기
for i in range(n):
for j in range(m):
if graph[i][j] == 'R':
start_y, start_x = i, j
elif graph[i][j] == 'G':
end_y, end_x = i, j
chk[start_y][start_x] = 0
dy = [1, 0, -1, 0]
dx = [0, 1, 0, -1]
def move_there(dir_y, dir_x, c_y, c_x):
while True:
c_y = c_y + dir_y
c_x = c_x + dir_x
if 0 > c_y or c_y >= n or 0 > c_x or c_x >= m or (graph[c_y][c_x] == 'D'):
return [c_y - dir_y, c_x - dir_x]
def bfs(s_y, s_x, e_y, e_x):
q = deque()
q.append((s_y, s_x))
while q:
y, x = q.popleft()
if y == e_y and x == e_x:
return chk[e_y][e_x]
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if 0 <= ny < n and 0 <= nx < m:
if graph[ny][nx] == '.':
ny, nx = move_there(dy[k], dx[k], y, x)
if chk[ny][nx] > chk[y][x] + 1:
chk[ny][nx] = chk[y][x] + 1
q.append((ny, nx))
result = bfs(start_y, start_x, end_y, end_x)
if result is None:
return -1
else:
return result
'.' 뿐만 아니라 'R', 'G'도 지나칠 수 있다. 이전 코드에선 if graph[ny][nx] == '.'로 되어있어 테케 통과가 되지 않음을 알 수 있다.
'D'가 아닌곳이라면 지나갈 수 있도록 수정했다!
from collections import deque
def solution(board):
n, m = len(board), len(board[0])
graph = [list(board[i]) for i in range(n)]
chk = [[float('inf')] * m for _ in range(n)]
# 시작점, 도착점 찾기
for i in range(n):
for j in range(m):
if graph[i][j] == 'R':
start_y, start_x = i, j
elif graph[i][j] == 'G':
end_y, end_x = i, j
chk[start_y][start_x] = 0
dy = [1, 0, -1, 0]
dx = [0, 1, 0, -1]
def move_there(dir_y, dir_x, c_y, c_x):
while True:
c_y = c_y + dir_y
c_x = c_x + dir_x
if 0 > c_y or c_y >= n or 0 > c_x or c_x >= m or (graph[c_y][c_x] == 'D'):
return [c_y - dir_y, c_x - dir_x]
def bfs(s_y, s_x, e_y, e_x):
q = deque()
q.append((s_y, s_x))
while q:
y, x = q.popleft()
if y == e_y and x == e_x:
return chk[e_y][e_x]
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if 0 <= ny < n and 0 <= nx < m:
if graph[ny][nx] != 'D': #수정한곳
ny, nx = move_there(dy[k], dx[k], y, x)
if chk[ny][nx] > chk[y][x] + 1:
chk[ny][nx] = chk[y][x] + 1
q.append((ny, nx))
result = bfs(start_y, start_x, end_y, end_x)
if result is None:
return -1
else:
return result