우노
[BFS] 이코테 “미로 탈출” Python 풀이 본문
문제
- N x M 크기의 직사각형 형태의 미로에 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다.
- 현재 위치는 (1, 1)이고 미로의 출구는 (N,M)의 위치에 존재하며 한 번에 한 칸씩 이동할 수 있다.
- 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시되어 있다.
- 미로는 반드시 탈출할 수 있는 형태로 제시된다.
- 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하라.
- 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다.
입력 조건
- 첫째 줄에 두 정수 N, M(4 <= N, M <= 200)이 주어진다.
- 다음 N개의 줄에는 각각 M개의 정수(0혹은 1)로 미로의 정보가 주어진다.
- 각각의 수들은 공백 없이 붙어서 입력으로 제시된다.
- 또한 시작 칸과 마지막 칸은 항상 1이다.
출력 조건
- 첫째 줄에 최소 이동 칸의 개수를 출력한다.
입력 예시
5 6
101010
111111
000001
111111
111111
출력 예시
10
풀이
- 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하는 문제이므로, BFS 를 사용해 풀 수 있습니다.
- 저는 방문 기록용 2차원 리스트와 이동칸 기록용 2차원 리스트를 사용해 풀었습니다.
예제 코드
from collections import deque
# N, M 을 공백으로 구분하여 입력 받기
n, m = map(int, input().split())
# 2차원 리스트의 맵 정보 입력 받기
maze = []
for i in range(n):
maze.append(list(map(int,input())))
# 방문 기록용 2차원 리스트
check = [[0]*m for _ in range(n)]
# 이동칸 기록용 2차원 리스트
count = [[0]*m for _ in range(n)]
# 상하좌우 이동용 방향
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# BFS 소스 코드 구현
def bfs():
# bfs 탐색용 큐 생성
queue = deque()
# 시작 위치를 큐에 삽입
queue.append((0,0))
# 시작 위치 방문 기록
check[0][0] = 1
# 시작 위치 이동칸 수 기록
count[0][0] = 1
# queue 의 요소가 전부 제거될 때까지 반복
while queue:
# 큐의 최하단 요소를 현재 위치로 저장하고 큐에서 제거
x, y = queue.popleft()
# 현재 위치를 기준으로 상하좌우 탐색
for i in range(4):
# 인접한 노드의 위치
nx = x + dx[i]
ny = y + dy[i]
# 인접한 노드가 미로 내부에 존재하는지 확인
if (nx >=0 and nx < n and ny >= 0 and ny < m):
# 인접한 노드를 방문할 수 있는지 확인
if (check[nx][ny] == 0 and maze[nx][ny] == 1):
# 방문할 수 있다면 큐에 삽입
queue.append((nx,ny))
# 인접 노드 방문 기록
check[nx][ny] = 1
# 인접 노드 이동칸 수 기록
count[nx][ny] = count[x][y] + 1
return count[n-1][m-1]
print(bfs())
참고
- 이것이 취업을 위한 코딩 테스트다. with python
'Algorithm > BFS' 카테고리의 다른 글
[BFS] 이코테 “연구소” Python 풀이 (0) | 2022.09.08 |
---|---|
[BFS] 이코테 “특정 거리의 도시 찾기” Python 풀이 (0) | 2022.09.08 |
[BFS] 백준 3055번 “탈출” C++ 풀이 (0) | 2022.01.22 |
[BFS] 백준 2178번 “미로 탐색” C++ 풀이 (4) | 2022.01.18 |
[BFS] 백준 1260번 "DFS 와 BFS" C++ 풀이 (0) | 2021.07.13 |
Comments