내 코드.. 이것도 맞음
class Solution:
def isPalindrome(self, x: int) -> bool:
# 숫자가 Palindrome 인지
# 음수면 무조건 아님
if x < 0:
return False
if x == 0:
return True
# 문자열 쓰지마!
res = []
while x:
res.append(x%10)
x = x//10
print(res)
return res == res[::-1]
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
상세 설명
- 팰린드롬이란?
- 팰린드롬 숫자는 앞뒤가 똑같은 숫자입니다.
- 예: 121, 1221, 12321 (모두 팰린드롬)
반면, 123, -121은 팰린드롬이 아닙니다.
- 음수와 0 처리:
- 음수는 무조건 팰린드롬이 아니므로 False 반환.
- 숫자 0은 팰린드롬으로 간주하므로 True 반환.
- 자리수 계산:
- 주어진 숫자가 몇 자리수인지 알아내기 위해 div를 사용.
- 예: x = 12345라면, div = 10000이 됩니다.
- 왼쪽과 오른쪽 자리 비교:
- 오른쪽 자리: x % 10 (나머지 연산으로 1의 자리 숫자 추출)
- 왼쪽 자리: x // div (몫 연산으로 가장 큰 자리 숫자 추출)
- 자리수 제거:
- 양쪽에서 가장 큰 자리수와 가장 작은 자리수를 제거:
- x % div: 왼쪽 자리 제거.
- // 10: 오른쪽 자리 제거.
- div //= 100: 자리수 비교를 위해 div를 두 자리 줄임.
- 양쪽에서 가장 큰 자리수와 가장 작은 자리수를 제거:
- 팰린드롬 판별:
- 왼쪽과 오른쪽 숫자가 다르면 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
이 코드는 숫자의 각 자리수를 직접 비교하기 때문에 추가 공간 없이 효율적으로 팰린드롬을 확인합니다.
아 코드는 이해 안감!
🧠 개선 포인트 (선택적)
- 리스트를 굳이 쓰지 않고, 숫자를 절반만 뒤집어서 비교하면 공간을 줄일 수 있어요.
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x % 10 == 0 and x != 0):
return False
rev = 0
while x > rev:
rev = rev * 10 + x % 10
x //= 10
# 짝수 길이: x == rev, 홀수 길이: x == rev // 10
return x == rev or x == rev // 10
이 방식은 O(1) 공간으로 해결하고, 뒤의 절반만 뒤집어서 앞의 절반과 비교합니다.
💡 요약
- 현재 코드도 정답 맞고, 직관적으로 이해하기 좋습니다.
- 더 효율적으로 하고 싶다면 숫자 절반만 뒤집는 방식도 괜찮습니다.
- 문자열 변환 없이도 두 방식 다 가능합니다.
'LeetCode > Grind169' 카테고리의 다른 글
| 22. Generate Parentheses ★★★★★ (1) | 2024.12.27 |
|---|---|
| [Trees: Trie] 211. Design Add and Search Words Data Structure ★★★★★ (1) | 2024.12.26 |
| Bit: 191. Number of 1 Bits (0) | 2024.12.17 |
| Bits: 190. Reverse Bits ☆★★ (0) | 2024.12.17 |
| 101. Symmetric Tree ☆★★ (1) | 2024.12.11 |