자료구조&알고리즘/백준

백준 | [파이썬 Python] 2206 벽 부수고 이동하기

두잇 두두 2024. 8. 30. 10:25
728x90

문제 제목이 참 재밌다 벽 부수고 이동이라

현실적으로는 쉽지만 코드로 구현하기 어려웠다ㅠ

 


문제

 

 

코드

from collections import deque

dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]

def bfs():
    visit = [[[0]*2 for _ in range(M)] for _ in range(N)]
    visit[0][0][0] = 1
    while q:
        x,y, wall = q.popleft()
        if x == N-1 and y == M-1:
            return visit[x][y][wall]
        for k in range(4):
            xx = x + dx[k]
            yy = y + dy[k]
            if 0<= xx < N and 0<= yy < M and visit[xx][yy][wall] == 0:
                if maze[xx][yy] == 0:
                    visit[xx][yy][wall] = visit[x][y][wall] + 1
                    q.append([xx, yy, wall])
                if wall == 0 and maze[xx][yy] == 1:
                    visit[xx][yy][1] = visit[x][y][0] + 1
                    q.append([xx,yy,1])
    return -1

N, M = map(int,input().split())
maze = [list(map(int,input())) for _ in range(N)]
q = deque()
q.append([0,0,0])
print(bfs())

 

 

설명

3차원 배열을 만들어서 벽을 체크 하는 응용력이 필요한 문제이다

visit을 통해서 방문한 경로를 체크해서 시간을 줄이고 완전 탐색을 통해서 해결하면 된다