백준 실버 1 · BFS / 그래프 탐색
문제 요약
| 항목 | 설명 |
|---|---|
| 입력 | N, M 그리고 0과 1로 이루어진 미로 |
| 이동 가능 | 상, 하, 좌, 우 인접 칸 |
| 의미 | 1은 이동 가능, 0은 이동 불가 |
| 목표 | (1,1)에서 (N,M)까지 가는 최소 칸 수 구하기 |
왜 BFS를 써야 할까?
핵심
이 문제는 단순히 도착할 수 있는지만 보는 문제가 아니라, 최소 칸 수를 구하는 문제입니다. 이런 문제는 가중치가 없는 그래프의 최단거리 문제로 볼 수 있고, 가장 대표적인 풀이가 바로 BFS입니다.
BFS가 맞는 이유
BFS는 시작점에서 가까운 칸부터 차례대로 탐색합니다.
즉, 어떤 칸에 처음 도착했을 때의 거리가 그 칸까지의 최단거리입니다.
그래서 도착 지점에 처음 기록된 값이 곧 정답이 됩니다.
최종 코드
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
arr = [list(map(int, input().strip())) for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs():
q = deque()
q.append((0, 0))
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m and arr[nx][ny] == 1:
arr[nx][ny] = arr[x][y] + 1
q.append((nx, ny))
bfs()
print(arr[n - 1][m - 1])
코드 한 줄씩 자세히 설명
이 코드가 특히 좋은 이유
1. BFS의 정석 구조를 그대로 사용했다
큐를 만들고, 시작점을 넣고, 꺼내고, 네 방향을 확인하고, 조건을 만족하면 다시 넣는 흐름이 아주 전형적입니다.
2. 방문 배열 없이 거리 배열까지 한 번에 처리했다
원래 1이던 칸을 2, 3, 4처럼 거리 값으로 바꾸기 때문에 메모리도 아끼고 코드도 간결해집니다.
3. 도착점 값을 바로 정답으로 쓸 수 있다
별도의 거리 계산 결과를 저장할 필요 없이 마지막 칸의 값만 출력하면 됩니다.
자주 틀리는 부분
마무리 정리
이 문제의 핵심 한 문장
가중치 없는 격자 최단거리 문제이므로 BFS를 사용하고, 방문한 칸에는 현재 칸 + 1을 저장해 최단거리와 방문 처리를 동시에 해결하면 됩니다.
문제 원문은 시작점에서 도착점까지 인접한 칸으로만 이동하면서 지나야 하는 최소 칸 수를 구하는 내용입니다. 따라서 BFS가 가장 자연스러운 정답 접근입니다. [문제 바로가기] [Source](https://www.acmicpc.net/problem/2178)
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 알고리즘] - [중] -백준 11725 트리의 부모 찾기 풀이- 실버2 (0) | 2026.03.21 |
|---|---|
| [정글 알고리즘] - [중] -백준 2294 동전 2- 골드 5 (1) | 2026.03.21 |
| [정글 알고리즘] - [중] -백준 1707 - 이분 그래프-골드4 (1) | 2026.03.20 |
| [정글 알고리즘] - [하] - 백준 2606 - 바이러스 실버3 (0) | 2026.03.20 |
| [정글 알고리즘] - [하] - 백준 16173 - 점프왕 쩰리 (Small)- 실버 4 (0) | 2026.03.20 |