본문 바로가기

Algorithm Problems/그래프

[백준/Python] 2178번: 미로 탐색

문제

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net


문제 요약

N × M 크기의 미로에서 (1, 1)에서 출발하여 (N, M) 위치로 이동할 때 지나야 하는 최소 칸 수를 출력한다.

 

+ 서로 인접한 칸으로만 이동할 수 있다. 

 

+ 1은 이동할 수 있는 칸, 0은 이동할 수 없는 칸을 나타낸다.

 

+ 칸을 셀 때, 시작 위치와 도착 위치도 포함한다.


코드

from collections import deque

# BFS 탐색
def bfs():
    que.append((0, 0))
    check[0][0] = 1
    cnt = 0

    while que:
        x, y = que.popleft() # 튜플 언패킹

        for d in range(4):
            nx = x + dx[d]
            ny = y + dy[d]

            if 0 <= nx < N and 0 <= ny < M and check[nx][ny] == 0 and arr[nx][ny] == 1:
                check[nx][ny] = check[x][y] + 1 # (x, y)에서 이동할 수 있는 칸은 check[x][y] + 1을 check에 저장 
                que.append((nx, ny))

    print(check[N-1][M-1])

N, M = map(int, input().split())

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

arr = [list(map(int, list(input()))) for _ in range(N)]

check = [[0] * M for _ in range(N)]

que = deque()

bfs()

코드 설명

1. 입력 받은 배열의 (0, 0)부터 BFS 탐색을 진행한다.

 

2. 방문을 체크하는 check 배열을 생성하고 (x, y)에 인접하여 이동할 수 있는 인덱스 (nx, ny)에 check[x][y] + 1값을 저장한다. 

 

3. check[N-1][M-1]을 출력한다.