DEV

LeetCode #9쉬움

9. 팰린드롬 숫자

9. Palindrome Number

Algorithm
해설 읽기 3
javascript

문제 설명

문제 설명: 정수 x가 주어졌을 때, x가 회문이면 true를 반환하고, 그렇지 않으면 false를 반환하세요.

예제

예제 1

입력: x = 121
출력: true
설명: 121은 왼쪽에서 오른쪽, 오른쪽에서 왼쪽으로 읽어도 동일합니다.

예제 2

입력: x = -121
출력: false
설명: 왼쪽에서 오른쪽으로 읽으면 -121입니다. 오른쪽에서 왼쪽으로 읽으면 121-가 됩니다. 따라서 팰린드롬이 아닙니다.

예제 3

입력: x = 10
출력: false
설명: 오른쪽에서 왼쪽으로 읽으면 01입니다. 따라서 팰린드롬이 아닙니다.

예제 4

입력: x = 121
출력: true
설명: 121은 왼쪽에서 오른쪽, 오른쪽에서 왼쪽으로 읽어도 동일합니다.

예제 5

입력: x = -121
출력: false
설명: 왼쪽에서 오른쪽으로 읽으면 -121입니다. 오른쪽에서 왼쪽으로 읽으면 121-가 됩니다. 따라서 팰린드롬이 아닙니다.

예제 6

입력: x = 10
출력: false
설명: 오른쪽에서 왼쪽으로 읽으면 01입니다. 따라서 팰린드롬이 아닙니다.

⚠️제약 조건

  • -231 ≤ x ≤ 231 - 1

해결 방법

🎯접근 방식

이 문제는 숫자를 뒤집어 원래 숫자와 비교하는 방식으로 해결합니다. 주어진 정수가 음수인 경우 바로 false를 반환하고, 양수인 경우 각 자리 숫자를 추출하여 뒤집은 숫자를 생성합니다. 이렇게 생성된 숫자가 원래 숫자와 동일한지 비교하여 회문 여부를 판단합니다. 핵심 아이디어는 숫자를 뒤집어 원래 숫자와 비교하여 회문인지 확인하는 것입니다.

솔루션 코드

복잡도 분석

시간 복잡도:O(log₁₀(x)) - 입력 숫자 x의 자릿수만큼 반복문이 실행되므로, 자릿수에 비례하는 로그 시간 복잡도를 가집니다.
공간 복잡도:O(1) - 추가적인 변수(reverse, xcopy)만 사용하므로 상수 공간 복잡도를 가집니다.

💡상세 설명

이 문제는 주어진 정수 x가 회문인지 여부를 확인하는 것입니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 동일한 문자열 또는 숫자를 의미합니다. 예를 들어, 숫자 121은 회문입니다.

이제 주어진 코드의 작동 방식을 단계별로 설명하겠습니다.

1. 알고리즘의 핵심 아이디어

이 알고리즘의 핵심은 숫자를 뒤집어서 원래 숫자와 비교하는 것입니다. 만약 뒤집은 숫자가 원래 숫자와 같다면, 그 숫자는 회문입니다. 음수는 회문이 될 수 없으므로, 처음에 음수인지 확인하여 바로 false를 반환합니다.

2. 코드의 주요 로직 설명

  • 음수 체크: 음수는 회문이 될 수 없으므로, x가 음수이면 즉시 false를 반환합니다.
  • 숫자 뒤집기: 양수인 경우, 숫자를 뒤집어서 원래 숫자와 비교합니다.
  • 결과 반환: 뒤집은 숫자가 원래 숫자와 같으면 true, 아니면 false를 반환합니다.

3. 각 단계별 동작 과정

  1. 음수 확인:

    if (x < 0) {
        return false;
    }
    
    • x가 음수라면 회문이 아니므로 false를 반환합니다.
  2. 숫자 뒤집기 준비:

    let reverse = 0;
    let xcopy = x;
    
    • reverse는 뒤집힌 숫자를 저장할 변수입니다.
    • xcopy는 원래 숫자를 보존하기 위한 복사본입니다.
  3. 숫자 뒤집기:

    while (x > 0) {
        reverse = (reverse * 10) + (x % 10);
        x = Math.floor(x / 10);
    }
    
    • x가 0보다 클 때까지 반복합니다.
    • x % 10x의 마지막 자릿수를 가져옵니다.
    • reverse * 10은 기존의 reverse 값을 자릿수를 하나 올려줍니다.
    • (reverse * 10) + (x % 10)reversex의 마지막 자릿수를 추가합니다.
    • x = Math.floor(x / 10)x의 마지막 자릿수를 제거합니다.
  4. 결과 비교 및 반환:

    return reverse === xcopy;
    
    • 뒤집은 숫자 reverse와 원래 숫자 xcopy를 비교합니다.
    • 두 값이 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

4. 핵심 변수들의 역할

  • reverse: 뒤집힌 숫자를 저장하는 변수입니다.
  • xcopy: 원래 숫자를 보존하여 최종 비교에 사용되는 변수입니다.
  • x: 반복문에서 숫자를 뒤집는 동안 원래 숫자의 자릿수를 하나씩 제거하는 데 사용됩니다.

5. 왜 이 방법이 효과적인지

이 방법은 숫자를 문자열로 변환하지 않고도 회문을 확인할 수 있는 효율적인 방법입니다. 문자열 변환을 피함으로써 메모리 사용을 줄이고, 수학적 연산을 통해 직접 숫자를 처리하여 성능을 높입니다. 또한, 음수에 대한 초기 체크를 통해 불필요한 연산을 피할 수 있습니다. 이로 인해 알고리즘이 간단하고 빠르게 작동합니다.

관련 문제