[백준 알고리즘] Node.js 1331. 나이트 투어

2023. 3. 28. 14:05코딩연습

1. 문제

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

 

1331번: 나이트 투어

나이트 투어는 체스판에서 나이트가 모든 칸을 정확히 한 번씩 방문하며, 마지막으로 방문하는 칸에서 시작점으로 돌아올 수 있는 경로이다. 다음 그림은 나이트 투어의 한 예이다. 영식이는 6×

www.acmicpc.net

 

2. 풀이

1) 나이트가 모든 체스판을 방문했는지 확인.

2) 마지막 방문 지점에서 시작지점으로 돌아올 수 있는지 확인.

- 나이트의 시작위치와 마지막 방문 위치의 절대값 차이가 (1,2), (2,1)이 맞는지 확인하면 된다.

3) 방문하는 과정에서 나이트의 움직임이 올바른지 확인.

- 나이트의 현재위치와 다음 움직인 위치의 절대값 차이가 (1,2), (2,1)이 맞는지 확인하면 된다.

const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

let result = true;

for(let i = 0; i < inputs.length-1; i++){
    // 중복 확인
    if(inputs.filter(item => item === inputs[i]).length !== 1){
        result = false;
        break;
    }
    
    // 시작 지점과 마지막 지점의 차이 계산
    if(i === 0){
        let [start, startNum] = inputs[i].split('');
        let [end, endNum] = inputs[35].split('');
        
        start = start.charCodeAt() - 65;
        end = end.charCodeAt() - 65;
        
        if(Math.abs(start - end) === 2 && Math.abs(Number(startNum) - Number(endNum)) === 1
           || Math.abs(start - end) === 1 && Math.abs(Number(startNum) - Number(endNum)) === 2){
            result = true;
        } else {
            result = false;
            break;
        }
    }
    
    // 나이트가 움직인 위치들 계산
    let [eng1, num1] = inputs[i].split('');
    let [eng2, num2] = inputs[i+1].split('');
    eng1 = eng1.charCodeAt() - 65;
    eng2 = eng2.charCodeAt() - 65;
    
    if(Math.abs(eng1 - eng2) === 2 && Math.abs(Number(num1) - Number(num2)) === 1
       || Math.abs(eng1 - eng2) === 1 && Math.abs(Number(num1) - Number(num2)) === 2){
        result = true;
    } else {
        result = false;
        break;
    }
}

if(result) console.log("Valid");
else console.log("Invalid");

 

3. 정리

- Math.abs() : 절대값 계산.

- String.charCodeAt() : 문자의 유니 코드 반환.

- 나이트의 위치의 규칙을 빨리 찾을 수 있어서 쉽게 해결할 수 있을 줄 알았지만, 생각보다 코드량이 많아졌다. 다른 분들의 해결 방법을 보면서 코드량을 줄일 수 있는지 확인해봐야겠다.