유효한 팰린드룸


:raising_hand: 알고리즘 공부 간 기록이 필요한 문제들에 대한 정리를 기록하는 포스트 입니다.


1. 문제 요건


영문, 숫자, 문자로 섞인 문자열(String) 이 주어지고 이에 대한 회문문자열에 대한 정합성 즉, 유효한 팰린드룸을 확인한다.

2. 코드


//ASCII Code 값 비교를 통한 문자 제거
function solution(str) {
    let answer = "YES"

    // 정규식 사용 a-z 가 아닌것들을 모두 삭제
    str = str.toLowerCase().replace(/[^a-z]/g, '')
    // 문자열 reverse 일치 확인
    if(str !== str.split('').reverse().join('')) {
        return "NO"
    }
    return answer
}

//정규식을 이용한 문자 제거
function solution2(str) {
    let answer = "YES"
    // 영어 아닌 값 자르기
    for(let i=0; i<str.length; i++) {
        if((str[i].charCodeAt() < 65 || str[i].charCodeAt() > 122)) {
            str = str.replace(str[i], '')
            i -= 1
        }
    }
    // 리버스 함수를 통해 일치 확인
    if(str.toLowerCase() !== str.toLowerCase().split('').reverse().join('')) {
        return "NO"
    }
    return answer
}

3. 결과정리


유효한 팰린더룸 문제는 어떤 문장에 대해 앞으로 읽으나 뒤로 읽으나 동일하다는 것을 확인하는 것이다.

이 문제는 정규식을 안다면 solution2 와 같이 아주 간단하게 풀 수 있다. 정규식이 바꿀 수 있는 코드의 간결함에 대해 다시한번 느낄 수 있는 문제이다. 이 문제가 아니더라도 정규식은 계속해서 공부하고 사용해보면서 익혀야겠다.

4. Key Point


이번 문제에서 기억해야 할 부분은 크게 2가지가 있다.

  1. 정규식
  2. 내장함수에 대한 이해 및 활용(split, reverse, join)
for(let i=0; i<str.length; i++) {
    if((str[i].charCodeAt() < 65 || str[i].charCodeAt() > 122)) {
        str = str.replace(str[i], '')
        i -= 1
    }
}

-----------------------------------------

str = str.toLowerCase().replace(/[^a-z]/g, '')