이번 글에서는 문자열을 인자로 받아 해당 문자열이 회문(Palindrome)인지 판별하는 JavaScript 함수를 작성해 보겠습니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 동일한 문자열을 의미합니다.
대표적인 회문 문자열의 예시는 다음과 같습니다.
- 'madam'
- 'dad'
- 'abcdcba'
이 문제의 핵심 조건은 내장 문자열 메서드를 사용하거나, split() 등으로 문자열을 배열로 변환하지 않고 해결해야 한다는 점입니다.
접근 방식: 두 포인터(Two Pointer) 기법
가장 효율적인 방법은 문자열의 양 끝에서 시작하여 중앙으로 이동하며 한 글자씩 비교하는 두 포인터 기법입니다. 왼쪽 포인터(start)와 오른쪽 포인터(end)를 두고, 각 위치의 문자가 일치하지 않으면 즉시 false를 반환합니다. 모든 비교를 통과하면 true를 반환합니다.
구현 예제 코드
const str = 'madam';
const isPalindrome = (str = '') => {
const { length } = str;
let start = 0, end = length - 1;
while(start < end){
const leftChar = str[start];
const rightChar = str[end];
if(leftChar !== rightChar){
return false;
};
start++;
end--;
};
return true;
};
console.log(isPalindrome(str));
console.log(isPalindrome('avsssvsa'));실행 결과
위 코드를 콘솔에서 실행하면 다음과 같은 결과가 출력됩니다.
true false
코드 설명
'madam'은 뒤집어도 'madam' 그대로이므로 true가 출력되고, 'avsssvsa'는 앞뒤 대칭이 아니므로 false가 출력됩니다. 이 알고리즘은 문자열 길이의 절반만큼만 순회하므로 시간 복잡도가 O(n/2), 즉 O(n)이며, 추가 배열 생성 없이 원본 문자열에서 직접 인덱스로 접근하기 때문에 메모리 측면에서도 매우 효율적입니다. 내장 메서드나 배열 변환 없이 순수하게 인덱스 비교만으로 문제를 해결할 수 있는 실용적인 예제입니다.