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

JavaScript에서 숫자가 회문(Palindrome)인지 확인하는 방법

문제 소개

숫자를 하나 입력받아 해당 숫자가 회문(palindrome)인지 아닌지에 따라 불리언(Boolean) 값을 반환하는 함수를 작성해 보겠습니다. 이때 중요한 제약 조건이 있습니다. 바로 숫자를 문자열이나 다른 데이터 타입으로 변환하지 않고 문제를 해결해야 한다는 것입니다.

회문 숫자란 앞에서부터 읽어도 뒤에서부터 읽어도 동일하게 읽히는 숫자를 의미합니다.

예를 들면 다음과 같습니다.

121
343
12321

그렇다면 이러한 조건을 만족하는 함수의 코드를 직접 작성해 보겠습니다.

구현 예제

const isPalindrome = (num) => {
    // 첫 번째 자릿수를 추출하기 위한 적절한 자릿값(factor) 구하기
    let factor = 1;
    while (num / factor >= 10){
      factor *= 10;
    }
    while (num) {
      let first = Math.floor(num / factor);
      let last = num % 10;
      // 첫 자릿수와 마지막 자릿수가 다르면 false 반환
      if (first != last){
        return false;
      }
      // 숫자에서 첫 자릿수와 마지막 자릿수 제거
      num = Math.floor((num % factor) / 10);
      // 두 자릿수가 제거되었으므로 factor를 100으로 나누어 축소
      factor = factor / 100;
    }
    return true;
};
console.log(isPalindrome(123241));
console.log(isPalindrome(12321));
console.log(isPalindrome(145232541));
console.log(isPalindrome(1231));

코드 동작 원리

이 알고리즘은 크게 세 단계로 진행됩니다.

1단계: 자릿값(factor) 계산 — 첫 번째 while 루프에서 입력된 숫자를 나누었을 때 가장 앞 자릿수를 얻을 수 있는 자릿값을 구합니다. 예를 들어 숫자가 12321이라면 factor는 10000이 됩니다.

2단계: 앞뒤 자릿수 비교Math.floor(num / factor)로 가장 앞 자릿수를, num % 10으로 가장 뒷 자릿수를 추출한 뒤 두 값을 비교합니다. 서로 다르면 즉시 false를 반환하여 불필요한 연산을 줄입니다.

3단계: 양 끝 자릿수 제거 및 반복Math.floor((num % factor) / 10) 연산으로 맨 앞과 맨 뒤의 자릿수를 잘라내고, 두 자릿수가 사라졌으므로 factor 역시 100으로 나누어 갱신합니다. 이 과정을 모든 자릿수에 대해 반복한 후 끝까지 통과하면 true를 반환합니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

false
true
true
false

123241과 1231은 뒤집었을 때 원래 숫자와 달라지므로 false가 출력되고, 12321과 145232541은 앞뒤 어느 방향으로 읽어도 같으므로 true가 출력되는 것을 확인할 수 있습니다. 이 방식은 문자열 변환 없이 오직 산술 연산만으로 회문 여부를 판별하므로 효율적이며, 시간 복잡도는 자릿수에 비례하는 O(log n) 수준입니다.