관리 메뉴

Jerry

[leetcode][파이썬]Palindrome Number #002 본문

Problem Solving/Algorithm 문제 풀기

[leetcode][파이썬]Palindrome Number #002

juicyjerry 2024. 5. 19. 20:42
반응형

https://leetcode.com/problems/palindrome-number/description/

 

 

 

 


 

 

 

오늘 풀어본 문제는 주어지는 수가 팰린드롬(Palindrome)이 되는지를 확인하는 문제이다.
 
 
 
 
팰린드롬이란, 간단히 말하면 거꾸로 읽어도 원래대로 읽는 것과 같은 문자열을 의미한다. 

 

 

 

풀이#1 - 자릿수 파악 + loop 판별

class Solution:
    def isPalindrome(self, x: int) -> bool:
        isMinus = False
        if (x < 0): 
            isMinus = True
        arr = []
        temp = x
        digit = 0

        if x < 0: return False
        while temp > 0:
            arr.append(temp % 10)
            temp //= 10
            digit += 1

        if digit <= 1: return True
        if isMinus: arr[0] *= -1
        for i in range(0, len(arr)):
            if arr[i] != arr[len(arr) - i - 1]: return False
        return True

 

 

 

처음 위 문제를 풀어냈을 때 코드이다.

 

1. 주어진 수가 음수인지 판별

2. 음수 일 경우, False 반환

3. 그렇지 않을 경우, loop문으로 주어진 수의 자릿수(digit) 파악 및 각 자릿수를 배열에 추가

4. 만약, 자릿수(digit)가 1자리 이하일 경우 True 반환

5. 만약, 음수일 경우 분별을 위하여 배열 첫번째 요소에 -1를 곱함

6. 마지막으로, 각 자릿수를 담은 배열을 순환하여 양 옆 수들을 비교해줌

 

 

풀긴 풀었는데, 장황해보여 여러모로 고칠 부분이 있어 보였다.

 

 

풀이#1  코드 정리

class Solution:
    def isPalindrome(self, x: int) -> bool:
        isMinus = False
        if (x < 0): 
            isMinus = True
            return False
        arr = []
        digit = 0

        while x > 0:
            arr.append(x % 10)
            x //= 10
            digit += 1

        if digit <= 1: return True
        for i in range(len(arr)):
            if arr[i] != arr[len(arr) - i - 1]: return False
        return True

 

나름 불필요한 코드들을 제거 했지만, 로직 자체 문제인지 여전히 장황해보였다.

 

 

 

풀이#2 - 주어진 수 뒤집어 판별

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if (x < 0 or (x % 10 == 0 and x != 0)): return False

        revertedNum = 0
        while x > revertedNum:
            revertedNum = revertedNum * 10 + (x % 10);
            x //= 10

        return x == revertedNum or x == revertedNum // 10

 

정답으로 제시된 코드이다.

 

1. 주어진 수(x)가 0 미만 또는 마지막 자리가 0인데 x가 0이 아닌 경우, False 반환

  - 숫자 x가 0이 아니면서 마지막 자리가 0인 경우 팰린드롬이 될 수 없음 

    ex) 10의 경우 x % 10 == 0 조건은 통과하지만 x != 0 조건은 통과 못 함 

  - 즉, 이 조건은 0에 국한되는 조건임을 알 수 있다. 다른 어떤 숫자도 마지막 자리가 0이면서 팰린드롬이 될 수 없다. 

 

2. 루프에서, 주어진 수 x의 절반을 뒤집어서 revertedNum에 저장

3. 주어진 수 x와 revertedNum가 동일한지 판별

  - revertedNum가 홀수인 경우, 가운데 숫자 버리기 위해 10으로 나눔

 

 

 

풀이#3 - string으로 형변환

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]

 

1. string으로 형변환한 x와 문자열 뒤집기은 x를 비교

  - str(x)[::-1]은 슬라이싱 기법을 사용해, 문자열을 -1 스텝으로 문자열 끝(end)에서 시작(start)까지 역순으로 문자를 가져옴

 

 

 

 

알게 된 점

이번 문제를 통해 문자열 또는 숫자를 뒤집는 방법을 2개를 알 수 있었다.

주어진 경우가 숫자일 경우, 문자열일 경우 둘다.

 

풀이#2의 뒤집기 부분은 어느정도 이해했다고 하지만 100% 습득은 아닌 거 같다. 

앞으로도 익숙해질 때까지 풀어봐야겠다.

 

# 풀이 2의 뒤집기 부분
revertedNum = 0
while x > revertedNum:
    revertedNum = revertedNum * 10 + (x % 10);
    x //= 10

 

 

 

반응형