Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 문자열이 회문(Palindrome)인지 확인하는 방법 – 구두점 제거와 대소문자 처리

이번 글에서는 주어진 문자열이 회문(Palindrome)인지 판별하는 JavaScript 함수를 작성해 보겠습니다. 문자열이 앞에서 읽으나 뒤에서 읽으나 같다면 함수는 true를 반환하고, 그렇지 않으면 false를 반환합니다.

회문 판별 시 고려해야 할 조건

문자열을 검증할 때 다음 두 가지 조건을 반드시 염두에 두어야 합니다.

  • 구두점 제거 및 소문자 변환: 마침표, 쉼표 등의 구두점은 모두 제거하고, 모든 문자를 소문자로 바꾼 뒤 회문 여부를 검사해야 합니다.

  • 대소문자 구분 없음(Case Insensitive): "racecar", "RaceCar", "race CAR"처럼 대소문자가 섞여 있어도 동일한 회문으로 인식해야 합니다.

구현 예제

아래 코드는 정규 표현식(Regex)을 활용해 알파벳과 숫자 이외의 모든 문자를 제거한 후, 문자열의 앞뒤를 비교하는 방식으로 회문을 판별합니다.

const str = 'dr. awkward';

const isPalindrome = (str = '') => {
    // 알파벳과 숫자가 아닌 모든 문자(구두점, 공백 등) 제거
    const regex = /[^A-Za-z0-9]/g;
    str = str.toLowerCase().replace(regex, '');

    let len = str.length;

    // 문자열의 절반만 순회하며 앞뒤 문자를 비교
    for (let i = 0; i < len / 2; i++) {
        if (str[i] !== str[len - 1 - i]) {
            return false;
        }
    }

    return true;
};

console.log(isPalindrome(str));

코드 설명

1. 정규 표현식으로 불필요한 문자 제거

/[^A-Za-z0-9]/g 패턴은 영문 대소문자와 숫자를 제외한 모든 문자를 의미합니다. replace() 메서드와 함께 사용하면 구두점과 공백을 한 번에 제거할 수 있습니다.

2. 소문자 통일

toLowerCase()를 호출하여 대소문자 차이로 인한 오탐을 방지합니다. 덕분에 "RaceCar"나 "race CAR"도 같은 방식으로 처리됩니다.

3. 효율적인 앞뒤 비교

전체 문자열을 뒤집어 비교하는 대신, 문자열 길이의 절반만큼만 반복하면서 str[i]str[len - 1 - i]를 비교합니다. 하나라도 일치하지 않으면 즉시 false를 반환하므로 성능 면에서도 유리합니다.

실행 결과

예제 문자열 "dr. awkward"는 구두점과 공백을 제거하고 소문자로 변환하면 "drawkward"가 되며, 이는 뒤집어도 "drawkward"로 동일하므로 회문입니다.

true

이처럼 정규 표현식과 간단한 반복문만으로도 구두점과 대소문자를 유연하게 처리하는 회문 판별 함수를 손쉽게 구현할 수 있습니다.