아무고토 몰라효
[LeetCode] Palindrome Number 본문
https://leetcode.com/problems/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.
Example 2:
Input: x = -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:
Input: x = 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
Constraints:
-2³¹ <= x <= 2³¹ - 1
고민
일단 `palindrome` 가 무엇인지 정확히 알고 넘어가야한다.
An integer is a palindrome when it reads the same forward and backward.
For example, 121 is a palindrome while 123 is not.
앞으로 읽으나 뒤로 읽으나 똑같은 단어, 문장, 숫자 등을 말한다.
즉 해당 문제는 특정 숫자를 앞으로 확인하나 뒤로 확인하나 같은 숫자인지 아닌지를 판단하는 문제이다.
int 를 string 으로 캐스팅하여 확인 하는 방법이 가장 먼저 떠올랐다. 한번 해보자.
해결
class Solution {
fun isPalindrome(x: Int): Boolean {
val str = x.toString()
val charArray = str.toCharArray()
var reversStr = ""
for (char in charArray.size - 1 downTo 0) {
reversStr += charArray[char]
}
return str == reversStr
}
}
int 를 string 으로 변환한 뒤에 해당 string 을 배열로 변환하여 확인 하는 방법으로 했다.
하지만, 맨 처음 index 를 0부터 확인하다보니 음수가 문제였다.
그래서 거꾸로 확인하는 방식을 선택했다.
결과
테스트 케이스는 다 통과 됬지만, 역시나 Runtime 은 12ms 로 좋은 코드가 아닌 것 같다.
후기
class Solution {
fun isPalindrome(x: Int): Boolean {
var orginal = x
var reversed = 0
if(orginal <0 || (orginal%10 == 0 && x !=0)) return false
while(orginal > reversed){
val pop = orginal % 10
reversed = reversed * 10 + pop
orginal /= 10
}
return orginal == reversed || orginal == reversed / 10
}
}
0ms 소요된 코드이다.
허거덩!!! 음수는 그냥 바로 false 로 반환하면 됬는데 나는 왜 .. 생각을 못했을까ㅠ
또 다른 조건을 보면 특정 숫자를 10으로 나눈 몫이 0으로 끝나는 숫자는 당연히 거꾸로 했을 때 false 이다. (10 -> 01 == false)
이때 주어진 숫자가 0이라면 어떤 숫자로도 나눠도 0이기 때문에 조건을 추가한다.
루프안에서는 주어진 숫자의 끝자리 1자리씩 구해서 새로운 숫자를 만들어 계산하는 방식을 썻다.
하지만 여기서 while 의 조건을 보면 original 이 reversed 보다 클 경우에만 확인하는 조건인데, 이 조건은 original의 절반의 숫자만 확인하는 것이다.
그 이유는 return에서 확인할 수 있다. `original == reversed`는 짝수 처리이다.
주어진 숫자가 '1221'이라고 가정하면 앞서 while 문에서 절반만 확인했으니, original 은 12, reversed는 12이다.
그렇다면 `original == reversed / 10`은 당연히 홀수 처리이다.
주어진 숫자가 '12321'이라고 가정하면 앞서 while 문에서 `original > reversed` 조건으로 인해
original 은 12, reversed 는 123이다.
코드를 분석하면서 느낀점은 내가 문제를 꼬아서 꼬아서 꼬아서 생각한 것 같다. 단순하게 접근해도 됬을 문제였을것같은데....
이제 다시 풀어봐야지!
'Coding Test' 카테고리의 다른 글
[LeetCode] Reverse String (3) | 2025.07.15 |
---|---|
[LeetCode] Valid Parentheses (2) | 2025.07.11 |
[LeetCode] Longest Common Prefix (2) | 2025.07.10 |
[LeetCode] Roman to Integer (1) | 2025.07.10 |
[LeetCode] Two Sum (3) | 2025.07.10 |