배열을 앞에서부터 읽었을 때와 뒤에서부터 읽었을 때 요소의 순서가 동일한 경우, 이를 회문(Palindrome)이라고 합니다. 예를 들어 [1, 5, 7, 4, 15, 4, 7, 5, 1] 배열은 어느 방향에서 읽어도 같은 순서를 가지므로 회문입니다.
이번 글에서는 리터럴 값으로 이루어진 배열을 인자로 받아, 해당 배열이 회문인지 아닌지를 판별하는 JavaScript 함수를 작성해 보겠습니다.
구현 아이디어
가장 효율적인 방법은 배열의 양쪽 끝부터 중앙을 향해 두 요소씩 짝지어 비교하는 것입니다. 배열 길이의 절반만 순회하면 되기 때문에 시간 복잡도는 O(n/2), 즉 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));코드 설명
- 먼저 구조 분해 할당을 통해 배열의 전체 길이를
l에 저장합니다. Math.floor(l / 2)로 배열의 중간 지점 인덱스를 구합니다.- 반복문을 돌며 인덱스
i의 요소와 끝에서i번째 요소(arr[l - i - 1])를 비교합니다. - 단 하나라도 일치하지 않는 쌍이 발견되면 즉시
false를 반환하고, 모든 쌍이 일치하면true를 반환합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
true
배열이 앞뒤 어느 방향으로 읽어도 동일하므로 true가 출력됩니다. 만약 배열 중간의 요소 하나라도 대칭이 깨진다면 false가 반환됩니다. 예를 들어 [1, 5, 7, 4, 15, 4, 8, 5, 1]처럼 대칭 위치의 값이 다르면 회문이 아니게 됩니다.