[LeetCode] (Easy) Palindrome Number
문제
Given an integer x, return true if x is a
, 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.
정답 코드
< 내 정답 코드 > 첫 번째 시도 - 오답!!
class Solution {
public boolean isPalindrome(int x) {
int halfLength = String.valueOf(x).length() / 2;
int reversedPreNum = Integer.parseInt(String.valueOf(x).substring(0, halfLength));
int reversedLastNum = 0;
for (int i = 0; i < halfLength; i++) {
reversedLastNum = reversedLastNum * 10 + x % 10;
x /= 10;
}
return reversedPreNum == reversedLastNum;
}
}
< 내 정답 코드 2 >
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
} else if (x >= 0 && x <= 9) {
return true;
}
int halfLength = String.valueOf(x).length() / 2;
int preNum = Integer.parseInt(String.valueOf(x).substring(0, halfLength));
int reversedLastNum = 0;
for (int i = 0; i < halfLength; i++) {
reversedLastNum = reversedLastNum * 10 + x % 10;
x /= 10;
}
return preNum == reversedLastNum;
}
}
< 타인 답변 코드 >
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 || ( x % 10 == 0 && x != 0 ) ) {
return false ;
}
int reversed = 0 ;
while(x > reversed) {
reversed = reversed * 10 + x % 10 ;
x /= 10 ;
}
return x == reversed || x == reversed / 10 ;
}
}
이것을 주의하자!
- 어렵지 않은 문제이지만 효율성을 위해서 고민하다 보니 시간이 많이 걸렸다.
- 보자마자 가장 편하게 생각할 수 있는 메커니즘은 "int 형을 char 형으로 변환한 다음에 하나씩 붙여서 마지막에 비교하자"이다. 하지만 형변환과 숫자의 처음부터 끝까지 작업을 수행해야 한다는 점에서 비효율적이라고 판단했다.
- 처음에는 int 형의 뒷자리를 하나씩 추출하여 앞자리로 붙이는 공식 ( newNum = newNum * 10 + num % 10 ) 을 이용하고자 했다. 특히 끝까지 비교하지 않고 '절반'만 잘라서 비교하면 훨씬 빠르게 해결할 수 있지 않을까 생각했다. 하지만 길이를 알려면 String.length( ) 의 힘을 빌려야 했기에 어쩔 수 없이 형변환이 필요했고, 또 비교 대상인 앞부분만 추출하려면 역시 string.substring( ) 메서드를 이용해야 했다. 결국 성공! ... 했지만 테스트에서 실패했다...
- 그 이유는 "한 자리 숫자가 들어올 때" 와 "마이너스 부호 ' - ' 가 들어올 때" substring( ) 부분에서 문제가 발생했던 것이다. 해당 코드까지 가기 전에 차단하기 위해서 맨 앞에 if 문으로 걸러내니 드디어 통과했다.
- 타인 코드를 보면, 내가 else - if 문으로 구현한 코드를 if 문 하나로 구현했다. 특히 1 ~ 9 범위의 숫자를 조건식으로 표현하는데 x % 10 == 0 으로 했다. 어렵지 않은 발상이지만 나는 생각하지 못했다. 또한 String 으로 변환하지 않고 그냥 모든 수를 뒤집어 한 번에 비교했다. 이게 더 빠른걸 보니 String으로 형변환 후 절반만 하는 것보단 int 형 연산이 더 효율적임을 유추가 가능하다.