오늘 풀어볼 문제는 Palindrome Number이다.
어떤 숫자가 들어왔을 때 팰린드롬 수면 True 아니면 False를 리턴하라는 문제다.
펠린드롬 수란 처음부터 읽었을 때랑 뒤에서 부터 읽었을 때랑 같은 수를 말한다.
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개를 비교하면 된다.
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 = 110 + 1232%10 => 10 + 2 => 12
...
이렇게 된다.
int를 str을 사용하지 않고 거꾸로 돌리는 방법이 있다는 것을 알게 됐다.
그리고 나중에 int를 사용해서 문제를 풀 일이 있을 때는
십의자리, 백의자리 이런 자리수를 활용해서 푸는 방법을 먼저 떠올려야 겠다고 생각했다.