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

JavaScript로 배열 속 회문(팰린드롬) 요소 찾는 방법

이번 글에서는 문자열 또는 숫자로 이루어진 배열을 입력받아, 그중 회문(palindrome)에 해당하는 요소들만 모아 새로운 배열로 반환하는 JavaScript 함수를 작성해 보겠습니다.

문제 예시

예를 들어, 다음과 같은 배열이 입력으로 주어졌다고 가정해 봅시다.

const arr = ['carecar', 1344, 12321, 'did', 'cannot'];

이때 기대되는 출력 결과는 다음과 같습니다.

const output = [12321, 'did'];

접근 방법

먼저 숫자나 문자열을 인자로 받아 해당 값이 회문인지 판별하는 헬퍼 함수(helper function)를 만듭니다. 그다음 배열을 순회하면서 filter() 메서드를 활용해 회문인 요소만 걸러낸 뒤, 필터링된 배열을 반환하면 됩니다.

회문 여부는 두 개의 포인터(pointer)를 활용해 효율적으로 확인할 수 있습니다. 하나는 값의 시작 지점에서, 다른 하나는 끝 지점에서 출발해 서로 교차할 때까지 양쪽 문자가 일치하는지 비교합니다. 중간에 한 번이라도 불일치가 발생하면 즉시 회문이 아니라고 판단하고, 모든 비교를 통과하면 true를 반환합니다. 이 방식은 전체 값을 뒤집어 비교하는 방법보다 불필요한 연산을 줄일 수 있다는 장점이 있습니다.

구현 코드

위 접근 방식을 코드로 구현하면 다음과 같습니다.

const arr = ['carecar', 1344, 12321, 'did', 'cannot'];
const isPalindrome = el => {
    const str = String(el);
    let i = 0;
    let j = str.length - 1;
    while(i < j) {
        if(str[i] === str[j]) {
            i++;
            j--;
        }
        else {
            return false;
        }
    }
    return true;
};
const findPalindrome = arr => {
    return arr.filter(el => isPalindrome(el));
};
console.log(findPalindrome(arr));

코드 설명

isPalindrome 함수는 먼저 String(el)을 통해 숫자든 문자열이든 일관되게 문자열로 변환합니다. 이후 왼쪽 포인터 i와 오른쪽 포인터 j를 두고 양쪽 끝부터 안쪽으로 이동하며 문자를 비교합니다. 모든 비교가 통과하면 true를 반환하고, 하나라도 어긋나면 false를 반환합니다.

findPalindrome 함수는 배열의 각 요소에 대해 isPalindrome을 호출하고, true를 반환한 요소만 남긴 새로운 배열을 만들어 반환합니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

[ 12321, 'did' ]

'carecar'는 앞뒤가 대칭이 아니고, 1344 역시 회문이 아니므로 제외됩니다. 반면 12321과 'did'는 앞에서 읽어도 뒤에서 읽어도 동일하기 때문에 최종 결과 배열에 포함됩니다.