문제
- N×M크기의 배열로 표현되는 미로가 있다.
1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 |
- 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다.
- 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 문제이다.
- 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
- 위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다.
- 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
- 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다.
- 다음 N개의 줄에는 M개의 정수로 미로가 주어진다.
- 각각의 수들은 붙어서 입력으로 주어진다.
알고리즘
bfs 탐색을 통해 좌/우/위/아래 방향을 갈 수 있는 확인하고 갈 수 있으면 걸음 수를 더해주고 큐에 추가한다. 추가한 큐는 똑같은 방법으로 반복하여 마지막 (n-1, m-1)위치에 있는 걸음 수를 출력한다.
코드
import sys
n, m = map(int, sys.stdin.readline().split())
# 2차원 미로
graph = []
for i in range(n):
graph.append(list(sys.stdin.readline()))
# 좌/우/위/아래 방향 이동
dx, dy = [-1, 1, 0, 0], [0, 0, 1, -1]
# 0,0 부터 탐색
queue = [(0, 0)]
graph[0][0] = 1
# bfs 탐색
while queue:
# 큐에서 원소를 팝하여 원소의 위치를 탐색
a, b = queue.pop(0)
# 4방향 확인
for i in range(4):
x = a + dx[i]
y = b + dy[i]
# 미로에서 이동할 수 있는 칸일 경우
if 0 <= x < n and 0 <= y < m and graph[x][y] == '1':
# 걸음 수를 더해준다.
graph[x][y] = graph[a][b] + 1
# 탐색할 곳을 추가한다.
queue.append((x, y))
print(graph[n-1][m-1])
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 2606번(파이썬): 바이러스 (0) | 2021.07.15 |
---|---|
[baekjoon] 백준 2667번(파이썬): 단지번호붙이기 (0) | 2021.07.14 |
[baekjoon] 백준 1260번(파이썬): DFS와 BFS (0) | 2021.07.12 |
[baekjoon] 백준 13164번(파이썬): 행복 유치원 (0) | 2021.07.11 |
[baekjoon] 백준 13417번(파이썬): 카드 문자열 (0) | 2021.07.10 |