<내 코드>
N, M = map(int, input().split())
maze = [list(input()) for _ in range(N)] # List[str]
# 방문 경로
done = [[0]*M for _ in range(N)]
# 좌,우,상,하 탐색을 위한 설정
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
# BFS 그래프 탐색
def bfs(x, y):
done[0][0] = 1 # 시작점
queue = [(0, 0)] # 큐 사용
while queue:
now = queue.pop(0)
for i in range(4):
nx = now[0] + dx[i]
ny = now[1] + dy[i]
if (0 <= nx < N) and (0 <= ny < M):
if done[nx][ny] == 0 and maze[nx][ny] == '1':
done[nx][ny] = done[now[0]][now[1]] + 1
queue.append((nx, ny))
return done[-1][-1]
print(bfs(0, 0))
처음 풀어보는 BFS 문제였는데.. 이해하는데 꽤나 어려웠다. 계속 반복적으로 생각하고 익혀야겠다.
1. 방문한 경로를 저장하기 위해 done 배열을 만든다.
2. 길을 찾아나갈 노드를 queue에 담아준다.
3. 좌표가 경로를 벗어나지 않는다면 '방문 여부 확인', '길이 맞는지' 확인한다.
4. 상,하,좌,우로 확인해 연결된 좌표를 확인한다.
5. 조건에 맞다면 방문 여부 수정 후, 큐에 넣어 다음 차례에 추가한다.
6. 방문여부 수정 때, 몇 번째 방문인지 현재 좌표의 방문 값에 +1을 더해준다.
7. done 배열의 가장 마지막 요소를 출력하면 몇 번째만에 도착인지 알 수 있다.
반응형
'알고리즘 문제풀기 > 백준 - Python' 카테고리의 다른 글
[백준 11724] 연결 요소의 개수 - Python (그래프탐색, DFS) (0) | 2020.08.31 |
---|---|
[백준 2606] 바이러스 - Python (그래프 탐색, DFS) (0) | 2020.08.30 |
[백준 1260] DFS와 BFS - Python (그래프 탐색) (0) | 2020.08.30 |
[백준 1783] 병든 나이트 - Python (그리디 알고리즘) (0) | 2020.08.28 |
[백준 1138] 한 줄로 서기 - Python (그리디 알고리즘) (0) | 2020.08.28 |