125. Valid Palindrome

늘보·2021년 10월 12일
0

LeetCode

목록 보기
40/69

💡 풀이

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function (s) {
  let start = 0;
  let end = s.length - 1;

  while (start < end) {
    let sCode = s.charCodeAt(start);
    let eCode = s.charCodeAt(end);

    if (!isLetter(sCode)) {
      start++;
      continue;
    }

    if (!isLetter(eCode)) {
      end--;
      continue;
    }

    if (toLowerCase(sCode) !== toLowerCase(eCode)) return false;

    start++;
    end--;
  }
  return true;
};

const isLetter = code => {
  if (
    (code >= 48 && code <= 57) || // 숫자
    (code >= 65 && code <= 90) || // 대문자
    (code >= 97 && code <= 122) // 소문자
  )
    return true;
  else return false;
};

const toLowerCase = code => {
  if (code >= 65 && code <= 90) return code + 32;
  else return code;
};

// 65 ~ 90 : A ~ Z
// 97 ~ 122: a ~ z

let s = 'A man, a plan, a canal: Panama';
isPalindrome(s);

📝 정리

문자열을 다루는데 연습하기 좋은 문제였다. palindrome이란, 거꾸로 뒤집어도 같은 문자열인지 말하는 것이다. (예를 들어, 'aaacaaa'는 palindrome이 맞다.)

palindrome 자체를 판별하는 건 어렵지 않다. 두 개의 포인터를 이용해 반복문을 돌 때마다 start index는 하나씩 더해주고, end index는 하나씩 빼주면 된다. 만약 하나씩 빼다가 s[start]s[end]가 다르다면 바로 falsereturn 해주면 된다.

문제는 공백이나 대문자, 특수문자 등이 들어가는 경우였는데, 이런 경우에 판별함수를 따로 만들어서(isLetter), 대문자를 소문자로 바꿔주는 함수를 만들어서(toLowerCase) 문제를 풀었다.

수정, 지적을 환영합니다!

문제 링크

https://leetcode.com/problems/valid-palindrome/

LeetCode GitHub

https://github.com/tTab1204/LeetCode

0개의 댓글