코딩연습

[백준 알고리즘] Node.js 7562. 나이트의 이동

니 뽀 2023. 6. 21. 15:43

1. 문제

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

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 

2. 풀이

1) 각 테스트 케이스마다 체스판의 한 변의 길이, 현재 있는 칸, 도착 지점이 나온다.

2) 최단 거리를 구하는 문제이기에 BFS를 사용한다.

const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const N = +inputs[0]; // 테스트 케이스
let idx = 1;
let result = "";

const bfs = (w, k, t) => {
  const visited = Array.from({length : w}, () => new Array(w).fill(0));
  visited[k[0]][k[1]] = 1;

  const queue = [];
  queue.push(k);

  // 나이트가 이동할 수 있는 경로들.
  const dx = [-2,-2,-1,-1, 2, 2, 1, 1];
  const dy = [-1, 1,-2, 2,-1, 1,-2, 2];

  while(queue.length > 0) {
    const [x, y] = queue.shift();
    
    if(x === t[0] && y === t[1]) {
      result += `${visited[x][y] - 1}\n`; // 최초 방문했을 때를 1로 설정했기 때문에 1을 빼줌.
      break;
    }

    for(let i = 0; i < 8; i++) {
      const nx = x + dx[i];
      const ny = y + dy[i];

	  // 나이트가 이동한 위치가 범위 밖이라면 돌아간다.
      if(nx < 0 || nx >= w || ny < 0 || ny >= w) continue;

	  // 나이트가 방문한 적이 없다면
      if(!visited[nx][ny]) {
        visited[nx][ny] = visited[x][y] + 1;
        queue.push([nx, ny]);
      }
    }
  }
}


for (let i = 0; i < N; i++) {
  const I = +inputs[idx++];
  const knight = inputs[idx++].split(" ").map((v) => +v);
  const target = inputs[idx++].split(" ").map((v) => +v);
  
  bfs(I, knight, target);
}

console.log(result)

 

3. 정리

- 처음 나이트의 이동 경로를 잘못 작성해서 틀렸었다. 꼼꼼하게 작성하도록 해야겠다.