백준 17609번 회문 Node.js 풀이

버건디·2024년 1월 23일
0

백준

목록 보기
70/75
post-thumbnail

문제 링크


- 내 풀이

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
profile
https://brgndy.me/ 로 옮기는 중입니다 :)

0개의 댓글