[LeetCode 리트코드] Palindrome Number - python

SUN·2022년 10월 26일
0

algorithm

목록 보기
25/30

오늘 풀어볼 문제는 Palindrome Number이다.

문제

어떤 숫자가 들어왔을 때 팰린드롬 수면 True 아니면 False를 리턴하라는 문제다.
펠린드롬 수란 처음부터 읽었을 때랑 뒤에서 부터 읽었을 때랑 같은 수를 말한다.

풀이 과정

풀이1 - mid를 기준으로 나눠서 판별

class Solution:
    def isPalindrome(self, x: int) -> bool:
        x = str(x)
        length = len(x)
        mid = length // 2
        even = True if length % 2 == 0 else False
        
        if length == 1:
            return True
        
        if even:
            start = mid-1
        else:
            start = mid
        
        if x[:mid] == x[:start:-1]:
            return True
        
        else:
            False

처음 생각했을 때는 그냥 str로 바꿔서 가운데를 기준으로 나눠서 판별하면 되겠다였다.

길이가 1이면 무조건 팰린드롬 수다.

홀수일 때는 가운데 수를 빼고 양 옆이 일치하면 된다.
즉 처음~중간-1 == reverse(중간+1 ~ 끝)이면된다.

예를 들어서 12321이 들어온다면
가운데 수인 3을 빼고 앞에 12, 뒤에 21을 뽑는다.
그리고 뒤에 수를 reverse하고 앞에 수와 일치하면 팰린드롬 수다.
즉 뒤에 21을 reverse하면 12고 이건 앞에 두 수인 12와 일치하기 때문에 이건 팰린드롬 수다.

짝수일 때는 처음~중간-1 == reverse(중간 +1 ~ 끝)이면 된다.
예를 들어서 1221이 들어온다면 그냥 앞에 2개 뒤에 2개를 비교하면 된다.

풀이2 - 전체 비교

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

사실 원래는 이 방법을 생각하긴 했는데 좀 식상해서 다른 방법을 찾다가 첫번째 방법으로 풀었다.
근데 가운데로 나눠서 비교하면 조건이 많아졌다. 효율성 차이도 딱히 없어보이고..
그냥 이렇게 간단하게 푸는게 더 나았을지도 모르겠다..

다른 사람의 풀이

class Solution:
    def isPalindrome(self, x: int) -> bool:
        
        new_num = 0
        
        original = x
        while x > 0: # x가 음수면 절대 팰린드롬 수가 될 수 없다.
            new_num = new_num * 10 + x % 10
            x = x // 10
        
        print(original, new_num)
        
        if original == new_num:
            return True
        else:
            return False

다른 사람의 풀이를 참고해서 다시 풀었다.

이렇게 str로 변경하지 않고 int자체로 비교할 수도 있었다..!!
원래 수에서 일의 자리부터 빼가면서 새로운 수에 할당하는 방법이다.

예를들어서 12321이 들어온다면
x = 12321, new_num = 0
x = 12321//10 => 1232, new_num = 010 + 12321%10 => 0 + 1 => 1
x = 1232//10 => 123, new_num = 1
10 + 1232%10 => 10 + 2 => 12
...
이렇게 된다.

알게 된 점

int를 str을 사용하지 않고 거꾸로 돌리는 방법이 있다는 것을 알게 됐다.
그리고 나중에 int를 사용해서 문제를 풀 일이 있을 때는
십의자리, 백의자리 이런 자리수를 활용해서 푸는 방법을 먼저 떠올려야 겠다고 생각했다.

profile
개발자

0개의 댓글