문제
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]을 출력한다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/Python] 2589번: 보물섬 (1) | 2023.11.15 |
---|---|
[백준/Python] 7562번: 나이트의 이동 (2) | 2023.11.15 |
[백준/Python] 17471번: 게리맨더링 (1) | 2023.09.30 |
[백준/Python] 1697번: 숨바꼭질 (1) | 2023.09.22 |
[백준/Python] 11060번: 점프 점프 (1) | 2023.09.21 |