이번 글에서는 하나의 숫자를 입력받아 해당 숫자가 회문 숫자인지 아닌지를 판별하는 JavaScript 함수를 작성해 보겠습니다.
회문 숫자란 무엇일까요?
회문 숫자(팰린드롬 숫자)는 왼쪽에서 읽어도 오른쪽에서 읽어도 동일한 숫자를 의미합니다. 즉, 숫자의 앞뒤가 대칭을 이루는 경우입니다.
예시
- 343 → 왼쪽에서 읽어도, 오른쪽에서 읽어도 '343'이므로 회문 숫자입니다.
- 6789876 → 좌우 대칭 구조이므로 회문 숫자입니다.
- 456764 → 뒤집으면 '467654'로 다르므로 회문 숫자가 아닙니다.
구현 코드
아래 코드는 문자열 변환 없이 수학적 연산만으로 가장 바깥쪽 자리부터 한 쌍씩 비교하며 회문 여부를 검사합니다.
const num1 = 343;
const num2 = 6789876;
const num3 = 456764;
const isPalindrome = num => {
// 숫자의 전체 자릿수 계산
let length = Math.floor(Math.log(num) / Math.log(10) + 1);
while(length > 0) {
// 마지막 자리 숫자 추출
let last = Math.abs(num - Math.floor(num / 10) * 10);
// 첫 번째 자리 숫자 추출
let first = Math.floor(num / Math.pow(10, length - 1));
// 양 끝 자리가 다르면 회문이 아님
if(first != last){
return false;
};
// 양 끝 자리를 제거하고 남은 중간 부분으로 갱신
num -= Math.pow(10, length - 1) * first;
num = Math.floor(num / 10);
length -= 2;
};
return true;
};
console.log(isPalindrome(num1));
console.log(isPalindrome(num2));
console.log(isPalindrome(num3));동작 원리 살펴보기
이 알고리즘은 다음과 같은 단계로 작동합니다.
- 자릿수 계산: 로그 연산을 활용해 입력된 숫자의 전체 자릿수를 구합니다.
- 양 끝 자리 비교: 나눗셈과 나머지 연산을 통해 첫 번째 자리와 마지막 자리를 추출한 뒤 서로 비교합니다.
- 양 끝 제거 후 반복: 두 자리가 일치하면 해당 자리들을 제거하고, 자릿수를 2씩 줄여가며 내부 숫자에 대해 같은 과정을 반복합니다.
- 결과 반환: 모든 자리 쌍이 일치하면 true, 하나라도 불일치하면 false를 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true true false
343과 6789876은 좌우 대칭이므로 true, 456764는 대칭이 아니므로 false가 출력됩니다. 이 방식은 문자열로 변환하지 않고 순수한 산술 연산만 사용하기 때문에 효율적이며, 숫자의 성질을 직접 다루는 좋은 알고리즘 학습 예제가 됩니다.