[BAKJOON] #2178. 미로 (BFS)

BAKJOON #2178. 미로 문제를 파헤쳐보자 :)

Jun 2, 2025

1. 문제 설명

📌
N×M크기의 배열로 표현되는 미로가 있다. (4X6)
1
0
1
1
1
1
1
0
1
0
1
0
1
0
1
0
1
1
1
1
1
0
1
1
notion image
notion image
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다.
이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오.
한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

2. 입출력 설명

2-1. 입력

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

2-2. 출력

📌
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다.
항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

3. 문제 풀이

from collections import deque # 입력 n, m = map(int, input().split()) # 미로 크기 입력 maze = [list(map(int, input().strip())) for _ in range(n)] # 2차원 리스트로 만듦 # 이동 방향 (상, 하, 좌, 우) dx = [-1, 1, 0, 0] # 행: 아래로 갈수록 증가 (상/하만 생각) dy = [0, 0, -1, 1] # 열: 오른쪽으로 갈수록 증가 (좌/우만 생각) # BFS 함수 def bfs(x, y): # 큐를 생성하고 시작점 (0, 0)을 큐 삽입 queue = deque() queue.append((x, y)) while queue: # 큐가 빌 때까지 반복 x, y = queue.popleft() for i in range(4): # 4방향 하나씩 확인하며 다음 위치 계산 nx = x + dx[i] ny = y + dy[i] # 범위 밖은 무시 if nx < 0 or ny < 0 or nx >= n or ny >= m: # 도착점은 n-1, m-1 continue # 벽이거나 이미 방문한 곳은 무시 if maze[nx][ny] != 1: # 1은 이동 가능한 칸 continue # 이동할 수 있는 칸이라면 거리 기록하고 큐에 추가 maze[nx][ny] = maze[x][y] + 1 queue.append((nx, ny)) # 도착 지점의 값이 최소 이동 칸 수 (시작 칸, 도착 칸 포함) return maze[n - 1][m - 1] # 출력 print(bfs(0, 0))

3-1. 문제 풀며 깨달은 점

  • 최소의 칸 수, 최단 거리를 구할 때는 BFS로 풀어야 하며 큐로 구현해야 정확
  • 이동 방향을 리스트로 정리함으로써, 바꾸거나 추가할 때 리스트 상에서만 추가하면 됨 (반복문 코드 수정 필요 X)