본문 바로가기

Algorithm & Data Structure

백준 - 2178번(BFS)

728x90
반응형

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

arr = []

for _ in range(n):
    arr.append(list(map(int, sys.stdin.readline().rstrip())))

def BFS():
    # 상,하,좌,우
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    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]

            #조건 만족시에만 실행(arr의 범위를 벗어나면 안됨)
            if nx >= 0 and nx < n and ny >= 0 and ny < m:
                if arr[nx][ny] == 1:
                    arr[nx][ny] = arr[x][y] + 1
                    q.append([nx, ny])

    # 목적지인 arr[n-1][m-1]에 존재하는 값이 최단거리(합)
    return arr[n - 1][m - 1]

ans = BFS()

print(ans)

 

보통 전체 탐색인 경우 DFS, BFS 상관없이 사용 가능하다.

다만 최단거리, 최소갯수 이런 최소가 나오면 보통 BFS를 쓰는 게 일반적이다.

그리고 이런 최단거리 최소횟수 문제는 보통 조건이 하나 추가될 때마다 문제가 2배씩 어려워지는 기분이다.

다행히 이 문제는 조건이 하나밖에 없다. 1만 지나갈 수 있다는 것이다.

또한 이 문제는 반드시 0,0 에서 시작하고 미로가 정상적으로 완주할 수 있는 경우만 주어지는 아주 친절한 문제다.

BFS 탐색을 통해서 이전까지 횟수의 +1 만큼 해주고 조건을 만족해서 이동한 좌표들을 q에 넣어준다.

최종적으로 n-1,m-1 까지 탐색을 마치면 n-1, m-1의 좌표에 존재하는 값이 최단거리 이동 횟수의 누적 값이다.

728x90
반응형

'Algorithm & Data Structure' 카테고리의 다른 글

백준 - 16236번(BFS,구현)  (0) 2022.04.10
백준 - 7576번(BFS)  (0) 2022.04.09
백준 - 2606번(DFS,BFS)  (0) 2022.04.09
백준 - 2161번(큐)  (0) 2022.04.01
백준 - 10845번(큐)  (0) 2022.04.01