[자료구조와 알고리즘] 125. Valid Palindrome (Feat. 정규표현식)

Jane Yeonju Kim·2023년 8월 28일
post-thumbnail

문제 설명

Leetcode - Top Interview 150 - 125. Valid Palindrome
주어진 문자열 s에서 영대문자는 영소문자로 바꾸고, 영문자나 숫자가 아닌 문자들을 전부 제거합니다.
이렇게 변형된 문자열이 앞에서 읽어도 뒤에서 읽어도 똑같다면 이 문자열은 회문(Palindrome)입니다.
그래서 주어진 문자열이 회문이라면 true, 아니면 false를 반환하는 함수를 만드는 문제입니다.


풀어보기

먼저 영문자나 숫자가 아닌 문자들을 제거하기 위해서 정규표현식을 사용했습니다!

정규표현식이란 문자열에서 특정 문자 조합을 찾기 위한 패턴입니다.
정규표현식은 new RegExp()로 호출하거나 슬래시(//)를 이용하여 리터럴 방식으로 생성할 수 있습니다.
자바스크립트에서는 정규 표현식도 객체로서, RegExp의 exec() test() 메서드를 사용할 수 있습니다.
String의 match(), replace(), search() 등의 메서드와도 함께 사용할 수 있습니다.
정규표현식 리터럴 방식을 사용할때 마지막 슬래시 뒤에 flag를 붙일 수 있는데, 전역 탐색 플래그 g를 붙여주면 매칭되는 결과가 여러개가 되더라도 모두 적용해줍니다.

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
  	// 영소문자와 숫자가 아닌(^) 문자 하나([]로 감싸준 부분)를 나타내는 정규표현식입니다. 
    const regex = /[^a-z0-9]/g;
    // 영문자를 전부 소문자로 바꿔준뒤 정규표현식에 해당하는 문자열은 전부 빈 문자열로 교체했습니다.
    s = s.toLowerCase().replace(regex, "");    
    
    const len = s.length;
    if (len <=1) return true
    for (let i=0; i<parseInt(len/2)+1; i++) {
      	// 투 포인터 방식으로 앞에서부터 s[i] 문자열 하나씩, 뒤에서부터 s[len-1-i] 문자열 하나씩 비교합니다.
        if (s[i] != s[len-1-i]) {
            return false
        }
    }
    return true
};

더 좋은 코드

더 가독성이 좋은 코드가 있어서 가져왔습니다. 🧑‍💻
협업을 할 때 다른 사람이 내 코드를 봐도 이해하기 쉬운 변수명을 써야한다고 배웠지만 문제 풀때마다 적용하기가 쉽지 않은 것 같습니다.. 인덱스(투 포인터)를 start, end로 사용해서 한 눈에 읽히는 코드입니다.

var isPalindrome = function(s) {
    
    s = s.toLowerCase();
    s = s.replace(/[^a-z0-9]/g, '');

    let start = 0;
    let end = s.length-1; 
    
    while (start < end){
        
        if(s[start] !== s[end]) return false
        start++;
        end--;
    }
    return true
};

정규표현식을 사용하지 않은 코드

정규표현식을 사용하지 않고 아스키 코드(ASCII)로 확인하는 방법도 있습니다.
어느 방법이 더 가독성이 좋은 지는 의견이 달라질 수 있겠지만, 제 생각에는 정규표현식을 쓰는 편이 직접 문자를 눈으로 확인할 수 있어서 더 좋다고 생각합니다.

미국정보교환표준부호(American Standard Code for Information Interchange), 또는 줄여서 ASCII(아스키)는 영문 알파벳을 사용하는 대표적인 문자 인코딩입니다. 아스키는 7비트 인코딩으로, 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 총128개로 이루어집니다. 출력 가능한 문자들은 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자입니다.

var isPalindrome = function(s){
    let left = 0, right = s.length - 1;
    while (left < right) {
        if (!isAlphaNumeric(s[left]))
            left++;
        else if (!isAlphaNumeric(s[right]))
            right--;
        else if (s[left].toLowerCase() !== s[right].toLowerCase())
            return false;
        else {
            left++;
            right--;
        }
    }
    return true;
}

function isAlphaNumeric(char) {
    const code = char.charCodeAt(0);
  	// 아스키 코드로 숫자(0:48, 9:57), 영대문자(A:65, Z:90), 영소문자(a:97, z:122)인지 확인하는 코드
    return (code >= 48 && code <= 57) || (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
}
profile
안녕하세요! 김개발자입니다 👩‍💻 🐈

0개의 댓글