코딩 공부

[Python](BFS) 백준 2178번 : 미로 탐색 본문

BFS & DFS

[Python](BFS) 백준 2178번 : 미로 탐색

Algomalgo 2024. 1. 10. 15:01
728x90


< 접근 방법 >

  1. 미로 모양을 그대로 arr라는 이차원 배열에 입력한다.
  2. 방문하지 않았던 곳만을 방문하기 위해서 이차원 배열인 visited 배열도 만들어준다.
  3. 첫 칸에서 시작해서 마지막 칸으로 이동하는 것이 fix되어 있으니까 bfs함수 내의 q에 처음으로 (0, 0)을 넣어준다.
  4. q를 돌리면서 마지막 칸에 도달하게 된다면 return으로 값을 반환하고 도달 전까지는 visited의 값을 1씩 증가해가며 방문 처리를 해준다.

from collections import deque
def bfs():
    q = deque()
    q.append((0, 0))
    visited[0][0] = 1
    
    while q:
        ci, cj = q.popleft()
        if (ci, cj) == (N-1, M-1):  # 종료조건 : 마지막 칸에 도달했을 시
            return visited[ci][cj]
        for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):   # 상하좌우 탐색
            ni = ci + di
            nj = cj + dj
            # 범위 내, 미방문, arr값 1의 조건을 만족한다면 q에 담고, 방문+1
            if 0<=ni<N and 0<=nj<M and not visited[ni][nj] and arr[ni][nj]:
                q.append((ni, nj))
                visited[ni][nj] = visited[ci][cj] + 1
    return "error"  # return 값을 써주는 것이 안정적


N, M = map(int, input().split())
# [1] 2차원 형태의 arr배열, visited 배열 생성
arr = [list(map(int, input())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]

# [2] bfs 함수의 return 값을 출력
print(bfs())

visited 배열을 찍은 결과

이해가 안되는 부분이 있으면 질문 주세요. 감사합니다.

728x90