[백준 알고리즘] 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() : 문자의 유니 코드 반환.
- 나이트의 위치의 규칙을 빨리 찾을 수 있어서 쉽게 해결할 수 있을 줄 알았지만, 생각보다 코드량이 많아졌다. 다른 분들의 해결 방법을 보면서 코드량을 줄일 수 있는지 확인해봐야겠다.
'코딩연습' 카테고리의 다른 글
[백준 알고리즘] Node.js 1343. 폴리오미노 (0) | 2023.03.29 |
---|---|
[백준 알고리즘] Node.js 1340. 연도 진행바 (0) | 2023.03.29 |
[백준 알고리즘] Node.js 1312. 소수 (0) | 2023.03.27 |
[백준 알고리즘] Node.js 1308. D-Day (0) | 2023.03.23 |
[백준 알고리즘] Node.js 1834. 나머지와 몫이 같은 수 (0) | 2023.03.21 |