문제
이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저)
- N * M 행렬 미로
- 1은 길, 0은 벽
- 1,1 지점부터 N, M 지점까지 이동하는데 필요한 최저횟수를 구하라.
# 입력 예시
5 6
101010
111111
000001
111111
111111
# 출력 예시
10
풀이
BFS에 익숙하지 않아 답안 코드를 많이 참고했다.
BFS에는 Queue가 사용되므로, Deque 를 이용하면 속도를 많이 줄일 수 있다.
- 1,1 지점은 0,0으로, N, M 지점은 N-1, M-1 지점으로 생각하면 된다.
- 처음 지점 좌표를 Queue에 삽입하고 큐가 빌 때까지 루프을 수행한다.
- 큐에서 좌표를 꺼내 상하좌우 값을 구한다.
- 상하좌우 각각에서 행렬을 벗어나거나 벽(0)일 경우,
이미 방문한 곳(>1)일 경우 continue 시킨다. - 방문한 적 없는 길(1)일 경우 해당지점에 지나온 지점수를 더한다.
- 해당지점 좌표를 Queue에 집어넣는다.
- 최종적으로 마지막지점(탈출구) 값을 반환한다.
from collections import deque
def bfs(miro, x, y, N, M):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
queue = deque()
queue.append((x, y))
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= M or miro[nx][ny]!=1: continue
miro[nx][ny] = miro[x][y]+1
queue.append((nx, ny))
return miro[N-1][M-1]
def solution():
N, M = map(int, input().split())
miro = []
for i in range(N):
miro.append(list(map(int, input())))
print(bfs(miro, 0, 0, N, M))
solution()
DFS / BFS 는 연습할수록 재밌는 것 같다.
더 많이 풀어봐야겠다.
댓글남기기