LeetCode/Top Interview 150

9. Palindrome Number

hyunkookim 2024. 12. 18. 19:36

9. Palindrome Number

 

https://youtu.be/yubRKwixN-U?si=w6hr9gibc6M_HInC

 

class Solution:
    def isPalindrome(self, x: int) -> bool:
        # 음수는 무조건 팰린드롬이 될 수 없음
        if x < 0:
            return False
        
        # 숫자 0은 팰린드롬으로 간주
        if x == 0:
            return True
        
        # 이제 양수만 처리
        # 자리수 계산을 위해 10의 몇 승인지 결정할 변수 초기화
        div = 1
        # x의 자리수에 맞는 나눗셈(div) 값을 결정
        while x >= 10 * div:
            div *= 10  # div를 10씩 곱해가며 x보다 작은 최대 10^n 값을 찾음
        
        # 팰린드롬 확인
        while x:
            # 오른쪽 숫자 추출 (1의 자리)
            right = x % 10  # x를 10으로 나눈 나머지가 1의 자리 숫자
            
            # 왼쪽 숫자 추출 (가장 큰 자리수)
            left = x // div  # x를 div로 나눈 몫이 가장 큰 자리 숫자
            
            # 왼쪽과 오른쪽 숫자가 다르면 팰린드롬이 아님
            if left != right:
                return False
            
            # 왼쪽과 오른쪽이 같다면, 해당 자리수를 제거하고 남은 숫자를 계산
            # x % div는 가장 큰 자리수를 제거 (ex: 12345 → 2345)
            # 그 결과를 10으로 나누어 오른쪽 자리수를 제거 (ex: 2345 → 234)
            x = (x % div) // 10
            
            # div 값을 100으로 나눠서 비교할 자리수를 줄임
            div //= 100  # div를 100으로 나눠야 양쪽에서 자리수가 1씩 줄어듦
        
        # 모든 자리수를 확인한 결과 팰린드롬이면 True 반환
        return True

 

 

상세 설명

  1. 팰린드롬이란?
    • 팰린드롬 숫자는 앞뒤가 똑같은 숫자입니다.
    • 예: 121, 1221, 12321 (모두 팰린드롬)
      반면, 123, -121은 팰린드롬이 아닙니다.
  2. 음수와 0 처리:
    • 음수는 무조건 팰린드롬이 아니므로 False 반환.
    • 숫자 0은 팰린드롬으로 간주하므로 True 반환.
  3. 자리수 계산:
    • 주어진 숫자가 몇 자리수인지 알아내기 위해 div를 사용.
    • 예: x = 12345라면, div = 10000이 됩니다.
  4. 왼쪽과 오른쪽 자리 비교:
    • 오른쪽 자리: x % 10 (나머지 연산으로 1의 자리 숫자 추출)
    • 왼쪽 자리: x // div (몫 연산으로 가장 큰 자리 숫자 추출)
  5. 자리수 제거:
    • 양쪽에서 가장 큰 자리수와 가장 작은 자리수를 제거:
      • x % div: 왼쪽 자리 제거.
      • // 10: 오른쪽 자리 제거.
    • div //= 100: 자리수 비교를 위해 div를 두 자리 줄임.
  6. 팰린드롬 판별:
    • 왼쪽과 오른쪽 숫자가 다르면 False 반환.
    • 모든 자리수를 확인해도 문제 없으면 True 반환.

실행 예제

입력: 121

  • div = 100 (가장 큰 자리수 찾기)
  • 1번 비교:
    • right = 121 % 10 = 1
    • left = 121 // 100 = 1,
    • (같음)
    • x = (121 % 100) // 10 = 2,
    • div = 100 / 100 = 1
  • 2번 비교:
    • x = 2, div = 1
    • right = 2 % 10 = 2
    • left = 2 // 1 = 2, 
    • (같음)
    • x = (2 % 100) // 10 = 0,
    • div = 1 / 100 = 0
    • x = 0, div = 0

출력: True


입력: 123

  • 1번 비교:
    • right = 123 % 10 = 3
    • left = 123 // 100 = 1, 
    • (다름)

출력: False


이 코드는 숫자의 각 자리수를 직접 비교하기 때문에 추가 공간 없이 효율적으로 팰린드롬을 확인합니다.

'LeetCode > Top Interview 150' 카테고리의 다른 글

172. Factorial Trailing Zeroes  (2) 2024.12.18
66. Plus One  (0) 2024.12.18
201. Bitwise AND of Numbers Range  (0) 2024.12.18
137. Single Number II  (0) 2024.12.18
67. Add Binary  (0) 2024.12.17