const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const N = Number(input.shift());
function isPalindrome(string) {
return string === string.split("").reverse().join("");
}
function isAlikePalindrome(string) {
const splittedString = string.split("");
for (let i = 0; i <= Math.floor(splittedString.length / 2); i++) {
// 맨 끝 문자가 서로 달라진다면
if (splittedString[i] !== splittedString[splittedString.length - 1 - i]) {
const firstSplitted = splittedString
.slice(0, i)
.concat(splittedString.slice(i + 1))
.join("");
const lastSplitted = splittedString
.slice(0, splittedString.length - 1 - i)
.concat(splittedString.slice(splittedString.length - i))
.join("");
return isPalindrome(firstSplitted) || isPalindrome(lastSplitted);
}
if (i === Math.floor(splittedString.length - 1 - i)) {
return isPalindrome(splittedString.slice(i, 1).join(""));
}
}
}
for (let i = 0; i < N; i++) {
if (isPalindrome(input[i])) {
console.log(0);
} else if (isAlikePalindrome(input[i])) {
console.log(1);
} else {
console.log(2);
}
}
각 문자를 반복문을 돌면서, 만약 회문이 아닌 경우에 isAlikePalindrome 함수가 실행된다.
해당 함수는 그 문자열을 split해서 또 양옆을 반복문을 돌면서, 다른부분을 찾을때까지 반복문을 돈다.
문자열을 서로 slice해서 합쳐준 후, 그것이 또 회문이 된다면 true를 뱉어준다.
slice는 start와 end 2개의 인자를 받아서 arr[start]부터 시작해서 arr[end]전까지의 값을을 반환한다.. 만약 인자가 하나라면 arr[index]부터 해당배열의 끝까지의 배열값을 반환한다.
const str = `abcdefg`.split("");
const exceptFStr = str.slice(0, 5).concat(str.slice(str.length - 1).join(""))
console.log(exceptFStr.join('')); // abcdeg