백준(2206) - 벽 부수고 이동하기 Python

최대 1 분 소요

백준(5639) - 이진 검색 트리

문제풀이: DFS, BFS 파이썬

최근에 풀었던 DFS, BFS 문제 중에 가장 까다로웠더 문제이다. 문제를 제출하면 계속 11% 쯤에서 중단되고 실패했었는데 그 해결법은 visit 리스트에서 벽을 부수고 진행했는지, 부수지 않고 진행했는지를 나누어서 visit을 처리해야하는 것을 간과했기 때문이다.

해결법은 visit을 3차원 리스트로 두고 풀어야 한다.

from collections import deque
import sys
input = sys.stdin.readline
answer = 0

mx = [0, 0, -1, 1]
my = [1, -1, 0, 0]

n, m = map(int, input().split())
arr = []
for _ in range(n):
    x = input().rstrip()
    arr.append(list(x))

visit = [[[0 for _ in range(m)] for _ in range(n)] for _ in range(2)]
visit[1][0][0] = 1

q = deque()
q.append((0, 0, 1, 1))
while q:
    x, y, distance, wall = q.popleft()
    if x == n-1 and y == m-1:
        answer = distance
        break
    else:
        for i in range(4):
            dx = x + mx[i]
            dy = y + my[i]
            if 0 <= dx < n and 0 <= dy < m:
                if visit[wall][dx][dy] == 0:
                    if arr[dx][dy] == '0':
                        visit[wall][dx][dy] = 1
                        q.append((dx, dy, distance+1, wall))
                    elif arr[dx][dy] == '1' and wall:
                        visit[wall][dx][dy] = 1
                        q.append((dx, dy, distance+1, 0))

if answer == 0:
    print(-1)
else:
    print(answer)

댓글남기기