728x90
문제
동빈이는 N x M 크기의 직사각형 형태의 미로에 갇혀 있다. 미로에는 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다. 동빈이의 위치는 (1, 1)이고 미로의 출구는 (N, M)의 위치에 존재하며 한번에 한 칸씩 이동할 수 있다. 이때 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시외어있다. 미로는 반드시 탈출할 수 있는 형태로 제시된다. 이때 동빈이가 탈출하기 위해 움직여야 하는 최소 칸의 갯수를 구하시오. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다.
입력조건
1. 첫째줄에 두 정수 N, M (4<= N,M <= 200)이 주어진다. 다음 N개의 줄에는 각각 M개의 정수(0 혹은 1)로 미로의 정보가 주어진다. 각각의 수들은 공백 없이 붙어서 입력으로 제시된다. 또한 시작칸과 마지막칸은 항상 1이다.
출력조건
첫째줄에 최소 이동 칸의 개수를 출력한다.
입력예시
5 6
101010
111111
000001
111111
111111
출력예시
10
이 문제는 BFS를 사용하는 문제이다.
아직 BFS의 구조에 익숙하지 않아 다른 문제들도 많이 다뤄봐야 할 것 같다.
BFS는 너비 우선 탐색으로 가까운 노드부터 탐색하는 알고리즘이다.
덩어리의 갯수를 세는건 DFS로 하지만, 길을 찾는 문제는 BFS로 풀면 될듯 하다.
BFS는 큐 구조를 이용하여 탐색하지 않은 노드가 있다면 큐에 삽입하고, 탐색을 마쳤다면, 큐에서 다음 노드를 꺼내 탐색한다.
from collections import deque
import sys
n,m = map(int,sys.stdin.readline().split())
dx = [1,-1,0,0]
dy = [0,0,1,-1]
li = []
for i in range(n):
li.append(list(map(int,input())))
def bfs(x,y):
queue = deque()
queue.append((x,y))
while(queue):
x,y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if li[nx][ny] == 0:
continue
if li[nx][ny] == 1:
li[nx][ny] = li[x][y] + 1
queue.append((nx,ny))
return li[n-1][m-1]
print(bfs(0,0))
다른건 다 재쳐두고, 함수를 정의한 부분만 집중적으로 공략하면 될 듯 하다.
728x90
'Study > CodingTest' 카테고리의 다른 글
[백준/Python] (S2) 2805 - 나무 자르기 (0) | 2024.03.04 |
---|---|
[이코테/Python] 5장 - 탐색 (0) | 2024.03.04 |
[백준/Python] (S2) 4963 - 섬의갯수 (0) | 2024.02.29 |
[백준/Python] (S1) 2468 - 안전영역 (0) | 2024.02.28 |
[이코테/Python] 3장 BFS/DFS - 음료수 얼려먹기 (0) | 2024.02.28 |