알고리즘/코딩 테스트

[백준 7562] 나이트의 이동 - bfs, 너비탐색 알고리즘, javascript, node.js

Judith Hopps 2023. 2. 17. 11:46
반응형

문제 : 

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

 

7562번: 나이트의 이동

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

www.acmicpc.net

 

알고리즘 :

1. 이 문제는 전형적인 bfs 문제이다.

2. 출발지부터 하나씩 나이트를 이동시켜 최소 횟수를 출력시키면 된다.

3. 횟수를 셀때는 visit[ny][nx] = visit[y][x] + 1 로 설정해서 이동횟수를 설정해야 한다.

 

 

문제 풀이 :

1. input 에서 각각의 테스트 별로 n, 현재 위치, 목표 위치를 저장한다.

for (let i=0;i<test*3;i++){
  const n = input[1+i]*1
  let visit = Array.from({length:n},()=>Array.from({length:n},()=>0))
  let cur = input[2+i].split(' ').map(Number)
  const target = input[3+i].split(' ').map(Number)
  i+=2
  // visit[cur[0]][cur[1]] = 1;
  let queue = [cur]
  // console.log(queue)
}

 

2. 출발지부터 bfs를 시작한다.

while(queue.length){
    const [y,x] = queue.shift()
    if (y===target[0]&&x===target[1]) {
      answer.push(visit[y][x]);break;
    }
    const dy = [-2,-2,-1,-1,1,1,2,2]
    const dx = [-1,1,-2,2,-2,2,-1,1]

    for(let j=0;j<8;j++){
      const ny = y+dy[j]
      const nx = x+dx[j]
      if (ny>=0&&nx>=0&&ny<n&&nx<n&&!visit[ny][nx]){
        queue.push([ny,nx]);
        // console.log(i)
        // console.log(queue)
        visit[ny][nx]=visit[y][x]+1
      }
    }
  }

이때, 나이트의 움직임은 아래 사진과 같다.

 

3. 전체 코드

const fs = require('fs');
const path = require('path');
const filePath = process.platform === 'linux' ? '/dev/stdin' : path.join(__dirname, '/나이트.txt');
const input = fs.readFileSync(filePath).toString().trim().split('\n');


let answer = []
const test = input[0]*1

for (let i=0;i<test*3;i++){
  const n = input[1+i]*1
  let visit = Array.from({length:n},()=>Array.from({length:n},()=>0))
  let cur = input[2+i].split(' ').map(Number)
  const target = input[3+i].split(' ').map(Number)
  i+=2
  // visit[cur[0]][cur[1]] = 1;
  let queue = [cur]
  // console.log(queue)
  while(queue.length){
    const [y,x] = queue.shift()
    if (y===target[0]&&x===target[1]) {
      answer.push(visit[y][x]);break;
    }
    const dy = [-2,-2,-1,-1,1,1,2,2]
    const dx = [-1,1,-2,2,-2,2,-1,1]

    for(let j=0;j<8;j++){
      const ny = y+dy[j]
      const nx = x+dx[j]
      if (ny>=0&&nx>=0&&ny<n&&nx<n&&!visit[ny][nx]){
        queue.push([ny,nx]);
        // console.log(i)
        // console.log(queue)
        visit[ny][nx]=visit[y][x]+1
      }
    }
  }
}
console.log(answer.join('\n'))
반응형