회문 배열이란?
배열의 요소를 앞에서 읽으나 뒤에서 읽으나 순서가 동일한 배열을 회문(palindrome) 배열이라고 합니다. 이 글에서는 리터럴 값으로 이루어진 배열을 입력받아 해당 배열이 회문 배열인지 판별하는 자바스크립트 함수를 작성해 보겠습니다.
대표적인 회문 배열의 예는 다음과 같습니다.
const arr1 = ['a', 'b', 'c', 'b', 'a']; const arr2 = [4, 7, 7, 4]; const arr3 = [7, 7, 7, 7, 7, 7];
arr1은 어느 방향에서 읽어도 'a', 'b', 'c', 'b', 'a' 순서가 그대로이며, arr2와 arr3 역시 뒤집어도 원래 배열과 완전히 동일합니다.
구현 아이디어
가장 효율적인 방법은 배열의 양쪽 끝에서부터 중앙을 향해 두 요소를 짝지어 비교하는 것입니다. 중간 지점까지만 확인하면 되기 때문에 배열 전체를 뒤집거나 새로운 배열을 만들 필요 없이 선형 시간(O(n)) 내에 검사를 마칠 수 있습니다.
예제 코드
const arr = [1, 5, 7, 4, 15, 4, 7, 5, 1];
const isPalindrome = arr => {
const { length: l } = arr;
const mid = Math.floor(l / 2);
for (let i = 0; i <= mid; i++) {
if (arr[i] !== arr[l - i - 1]) {
return false;
}
}
return true;
};
console.log(isPalindrome(arr));코드 설명
arr.length를 구조 분해 할당으로 가져와 변수l에 저장합니다.Math.floor(l / 2)로 배열의 중간 인덱스를 계산합니다.- 반복문을 돌며 앞쪽의 i번째 요소와 뒤쪽의 i번째 요소(
arr[l - i - 1])를 비교합니다. - 하나라도 다르면 즉시
false를 반환하고, 모든 짝이 일치하면true를 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true
예제의 배열 [1, 5, 7, 4, 15, 4, 7, 5, 1]은 앞에서 읽든 뒤에서 읽든 순서가 동일하므로 회문 배열로 판별됩니다. 이처럼 투 포인터 방식의 비교만으로도 추가 메모리 없이 간단하고 빠르게 회문 배열 여부를 확인할 수 있습니다.