Coding Problem

[BOJ 2206] 벽 부수고 이동하기

Yepchani 2025. 3. 2. 20:00
반응형

문제

벽 부수고 이동하기

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

 

 

풀이

설명

출발점에서 도착점까지 가는 최단 거리를 구하는 문제입니다.

 

규칙은 다음과 같습니다.

  1. 상하좌우 인접한 칸으로 이동 가능합니다.
  2. 벽이 있는 경우, 최대 한 번 부수고 이동할 수 있습니다.

 

BFS를 이용해 해결할 수 있습니다.

 

거리 배열은 벽을 부순 횟수도 포함해야 하므로 3차원 배열로 만들 수 있습니다.

 

예시 코드

function solution() {
  const BREAK_LIMIT = 1;

  const [n, m] = input().split(" ").map(Number);
  const board = Array.from({ length: n }, () => input().split("").map(Number));
  const dx = [0, -1, 0, 1];
  const dy = [1, 0, -1, 0];
  const dist = Array.from({ length: n }, () =>
    Array.from({ length: m }, () => Array(BREAK_LIMIT + 1))
  );
  dist[0][0][0] = 1;
  const queue = new Queue();
  queue.enqueue([0, 0, 0]);

  while (!queue.isEmpty()) {
    const [cx, cy, w] = queue.dequeue();
    if (cx === n - 1 && cy === m - 1) return dist[cx][cy][w];

    for (let i = 0; i < 4; i++) {
      const nx = cx + dx[i];
      const ny = cy + dy[i];

      if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
      if (dist[nx][ny][w]) continue;

      if (board[nx][ny] === 0) {
        dist[nx][ny][w] = dist[cx][cy][w] + 1;
        queue.enqueue([nx, ny, w]);
      } else if (w < BREAK_LIMIT) {
        dist[nx][ny][w + 1] = dist[cx][cy][w] + 1;
        queue.enqueue([nx, ny, w + 1]);
      }
    }
  }

  return -1;
}

'Coding Problem' 카테고리의 다른 글

[BOJ 3190] 뱀  (0) 2025.03.03
[BOJ 2841] 외계인의 기타 연주  (0) 2025.02.27
[BOJ 1697] 숨바꼭질  (0) 2025.02.26
[BOJ 1043] 거짓말  (0) 2025.02.25
[BOJ 2003] 수들의 합 2  (0) 2025.02.24