[알고리즘] 백준 2206 벽 부수고 이동

CHOI IN HO·2024년 3월 4일
0

코딩테스트

목록 보기
57/74

풀이

처음엔 dfs 방식으로 벽 하나씩 1을 모두 바꿔주는 방식으로 풀이를 했고, 당연히 시간 초과가 떴다.
다음으로 푼 방식은 visited배열과 큐에 벽 부수는 횟수도 추가시켜 3차원 배열을 통해 문제를 풀어주었다. 3차원 배열을 생각해내는게 쉽지 않았다.

from collections import deque
import sys
n, m = map(int, sys.stdin.readline().split())
array = [list(map(int, sys.stdin.readline().rstrip())) for _ in range(n)]

dx = [-1, 1, 0, 0]
dy = [0,0,-1,1]
# 3차원 리스트 (행, 열, 벽을 깬 여부) 생성
visited = [[[0] * 2 for _ in range(m)] for _ in range(n)]

def solve(x,y,wall_break_left, visited, array):
    q = deque()
    q.append((x,y,wall_break_left))
    visited[x][y][wall_break_left] = 1

    while q:
        x,y,wall_break_left = q.popleft()
        if x == n-1 and y == m-1:
            return visited[x][y][wall_break_left]
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            if nx < 0 or nx >= n or ny<0 or ny>=m:
                continue
            # 벽을 깨지 않고 이동
            if array[nx][ny] == 0 and visited[nx][ny][wall_break_left] == 0:
                q.append((nx,ny, wall_break_left))
                visited[nx][ny][wall_break_left] = visited[x][y][wall_break_left] + 1
            # 벽을 깨고 이동
            if array[nx][ny] == 1 and wall_break_left == 1:
                q.append((nx,ny, wall_break_left-1))
                visited[nx][ny][wall_break_left-1] = visited[x][y][wall_break_left] +1
    return -1

print(solve(0,0,1,visited,array))
profile
개발자기 되기 위해선 무엇이든!

0개의 댓글