하루하루는 성실하게 인생 전체는 되는대로

BFS - 미로 탈출 본문

알고리즘 Archive

BFS - 미로 탈출

희롭 2021. 3. 24. 22:04
from collections import deque

n, m = map(int, input().split())
result = 0
graph = []

for i in range(n):
    graph.append(list(map(int, input())))

# 상하좌우 이동할 방향 정의
dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs(x, y):
    que = deque()
    #첫 번째 노드를 큐에 넣기
    que.append((x,y))
    #큐가 빌 때까지 실행
    while que:
        #큐의 맨 첫번째 요소를 큐에서 빼서 x, y에 담기
        x,y=que.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:
                continue
            #1아니고 0이면 무시
            if graph[nx][ny]==0:
                continue
            #1이면 이전 노드의 값에 1 더한 값을 넣어주기
            if graph[nx][ny]==1:
                graph[nx][ny]=graph[x][y]+1
                #이 노드를 큐에 넣기
                que.append((nx,ny))
        #1인 노드가 더이상 존재하지 않으면, 큐에서 빼기만 하므로 큐가 비게 됨.
    
    return graph[n-1][m-1]

# 맨 위 첫 번째 노드에서 시작해서 이어나가기 때문에
# 0,0 한번만 넣어줌.
print(bfs(0, 0))

풀이 포인트!!

  • 0,0 노드에서 시작한다 ⇒ 함수에 0,0만 한번 대입
  • while que 돌리기 전에, 초기 위치 노드를 큐에 넣고 시작한다
  • while문 안에서, 큐의 첫 번째 요소를 제거하여 현재 위치 노드로 삼는다
  • 현재 노드에서 상하좌우 살펴서, 1인 노드에만 "현재노드값+1" 해주고, 이 위치 노드들을 모두 큐에 넣어준다
  • 큐가 빌 때까지 위 과정 반복한다
    ⇒ 1인 노드가 더이상 존재하지 않으면, 큐에서 제거되기만 하므로, 큐가 텅 비게 됨.

'알고리즘 Archive' 카테고리의 다른 글

[백준] 2667 - 단지번호붙이기  (0) 2021.03.24
[백준] 1260 - dfs와 bfs (미완-다시풀기)  (0) 2021.03.24
DFS - 음료수 얼려 먹기  (0) 2021.03.24
[백준] 2750 - 수 정렬  (0) 2021.03.24
[백준] 1920 - 수 찾기  (0) 2021.03.24
Comments