부부의 코딩 성장 일기

LeetCode 9(Palindrome Number, Python) 본문

Algorithm/LeetCode

LeetCode 9(Palindrome Number, Python)

제로_콜라 2023. 10. 29. 14:56

1. 문제 링크

 

Palindrome Number - LeetCode

Can you solve this real interview question? Palindrome Number - Given an integer x, return true if x is a palindrome, and false otherwise.   Example 1: Input: x = 121 Output: true Explanation: 121 reads as 121 from left to right and from right to left. Ex

leetcode.com

2. 문제 설명

  • 주어진 int를 뒤에서 앞으로 읽었을 때 같은 정수인 지 판단하는 문제
  • 예시) int=121 이면 True, int=-121이면 False, int=10이면 False

3. 처음 풀이 

  • int를 str으로 바꾸면 거꾸로 나열하기 쉽고 원래 값과 비교하여 True, False 반환
  • str(x)는 int인 x를 문자열로 바꾸어 주고 str(x)[::-1]은 str(x)를 역순으로 바꾼 문자열, 그 이유는 5. 배운점에서 자세히 설명
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if str(x)==str(x)[::-1]:
            return True
        else:
            return False

4. 다른 풀이 

  • 문자열로 바꾸지 않고 int 형태로 풀이 시도
  • x=123=100+20+3이면 10으로 나눈 나머지는 3, 몫은 12
  • 그 몫 12를 10으로 나눈 나머지는 2, 몫은 1이므로 순서대로 3, 2,1을 얻는다
  • 이를 결과값에 더한 후 10배 하는 과정을 반복하면 300+20+1=321을 얻고 처음 값인 123과 같은지 비교 
class Solution:
    def isPalindrome(self, x: int) -> bool:
        origin=x
        if x< 0 : #음수면 False
            return False
        reverse=0
        while x>0: #x를 10으로 나눈 몫이 0이 될 때까지 반복
            reverse=10*reverse+x%10 #reverse를 10배 후 x를 10으로 나눈 나머지를 더하여 저장
            x=x//10 #x를 10으로 나눈 몫으로 업데이트
        if origin==reverse: #원래 값과 reverse가 같은지 판단
            return True
        else:
            return False

5. 배운 점 

  • 문자열 인덱싱에서 역순으로 불러오거나 원하는 칸씩 점프하며 불러올 수 있다. 
  • 이를 응용하면 문자열을 역순으로 뒤집을 수 있음
str='abcd'

print(str[0])       #0번 : a
print(str[0:2])     #0번부터 2번 전까지 : ab
print(str[0:])      #0번부터 끝까지 : abcd 
print(str[0:3:2])   #0번부터 3번 전까지 2칸씩 점프 : ac
print(str[-1])      #-1번째 즉 뒤에서 1번 : d
print(str[-1:-4:-2])  #-1번부터 -4번 전까지 역순으로 2칸씩 점프 : db
print(str[::-1])    #전체 역순 : dcba