πŸ’‘λ¬Έμ œ 뢄석 μš”μ•½

πŸ’‘μ•Œκ³ λ¦¬μ¦˜ 섀계

πŸ’‘μ½”λ“œ

const fs = require('fs');
const path = require('path');

const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');

// μž…λ ₯κ°’ 처리
const [N, M] = input[0].split(' ').map(Number); // 첫 μ€„μ—μ„œ Nκ³Ό M κ°’ κ°€μ Έμ˜΄
const maze = input.slice(1).map(line => line.split('').map(Number)); // λ‚˜λ¨Έμ§€ μ€„μ—μ„œ 미둜 정보 κ°€μ Έμ˜΄

function bfs(maze, N, M) {
  const directions = [
    [0, 1],  // 였λ₯Έμͺ½
    [1, 0],  // μ•„λž˜μͺ½
    [0, -1], // μ™Όμͺ½
    [-1, 0]  // μœ„μͺ½
  ];

  const queue = [[0, 0]]; // μ‹œμž‘μ  (0, 0)
  const visited = Array.from({ length: N }, () => Array(M).fill(false));
  visited[0][0] = true;

  while (queue.length) {
    const [x, y] = queue.shift();

    // 도착지에 λ„λ‹¬ν•˜λ©΄ κ·Έ 칸의 값을 리턴 (μ΅œλ‹¨ 경둜)
    if (x === N - 1 && y === M - 1) {
      return maze[x][y];
    }

    // μƒν•˜μ’Œμš° 탐색
    for (const [dx, dy] of directions) {
      const nx = x + dx;
      const ny = y + dy;

      // λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•Šκ³ , 벽이 μ•„λ‹ˆκ³ , 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
      if (nx >= 0 && ny >= 0 && nx < N && ny < M && maze[nx][ny] === 1 && !visited[nx][ny]) {
        queue.push([nx, ny]);
        visited[nx][ny] = true;
        maze[nx][ny] = maze[x][y] + 1; // 이전 κ²½λ‘œμ—μ„œ +1
      }
    }
  }

  return -1; // 도달할 수 μ—†λŠ” 경우
}

// μ΅œλ‹¨ 경둜 좜λ ₯
console.log(bfs(maze, N, M));

πŸ’‘μ‹œκ°„λ³΅μž‘λ„