[자바스크립트/알고리즘] 회문(Palindrome) 검사
728x90

문제

주어진 문자열이 회문이면 true를 반환, 아니면 false를 반환하다.

영숫자가 아닌 문자들(non-alphanumeric characters)은 제거되어야 한다.

대소문자 구분도 없어야 한다.

 

나의 풀이

function palindrome(str) {
  let alphanumeric = /[a-z]|[0-9]/gi;
  str = str.match(alphanumeric);

  for(let i = 0; i < str.length; i++){ //소문자 변경
    if(str[i].toUpperCase()) str[i] = str[i].toLowerCase();
  }

  let cnt = 0;
  if(str.length % 2 === 1){ //str의 길이가 홀수일 때
    for(let i = 0; i < str.length/2-1; i++){
      if(str[i] === str[str.length-i-1])
        cnt++;
    }
  } else{ //str의 길이가 짝수일 때
    for(let i = 0; i < str.length/2; i++){
      if(str[i] === str[str.length-i-1])
        cnt++;
    }
  }

  if(cnt === Math.floor(str.length/2)) return true;
  return false;
}

if, else문 안의 코드가 상당히 겹쳐서 불편하다.

어떻게든 줄이고 싶은데 이미 해설을 보고 더 좋은 코드를 발견하여 이대로 놔두었다.

 

나의 풀이는 직관적이라고 생각한다.

alphanumeric은 정규식을 이용하여 두 번째 줄에 선언해주었다.

그 후 주어진 문자열 str에서 매치가 되는(조건에 만족하는) 문자들만 다시 str에 저장했다.

 

반복문으로 대문자는 소문자로 만들어주었다.

 

str의 길이가 홀수일 때, 영숫자를 주어진 문자열/2-1 만큼 돌며 회문 조건을 만족할 때 cnt를 증가해주었다.

str의 길이가 짝수일 때는 영숫자를 주어진 문자열/2 만큼 돌며 위와 같은 일을 한다.

 

그 후 cnt가 str 길이의 절반을 내림차순 한 것과 같으면 true, 아니면 false를 반환한다.

 

다른 풀이

function palindrome(str) {
  return (
    str.replace(/[\W_]/g, "").toLowerCase() ===
    str
      .replace(/[\W_]/g, "")
      .toLowerCase()
      .split("")
      .reverse()
      .join("")
  );
}

 

코드가 정말 간단해서 놀랬다...! reverse()를 사용해서 회문인지 검사했다.

나는 str를 애초에 배열로 접근해서 생각했는데, 간단히 문자열로 풀 수 있었다....

 

항상 알고리즘을 풀 때 복잡하게 생각하는 경향이 있는데 조금 쉽게 생각해야겠다..

 

 

JavaScript Algorithms and Data Structures Projects: Palindrome Checker

(문제 출처:www.freecodecamp.org)

320x100