코딩 테스트

[LeetCode] (Easy) Palindrome Number

ImKDM 2022. 11. 23. 22:09
728x90

문제


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.

 

정답 코드


<  내 정답 코드  >     첫 번째 시도  -  오답!!

 

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 형 연산이 더 효율적임을 유추가 가능하다.