본문 바로가기

코딩 테스트

[LeetCode] (Medium) Reverse Integer *

728x90

문제


Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.

Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

 

Example 1:

 

Input: x = 123
Output: 321

 

Example 2:

 

Input: x = -123
Output: -321

 

Example 3:

 

Input: x = 120
Output: 21

 

정답 코드


<  내 정답 코드  >

 

class Solution {
    public int reverse(int x) {
        boolean isSign = false;
        String number = String.valueOf(x);
        if (String.valueOf(x).charAt(0) == '-') {
            isSign = true;
            number = number.substring(1);
        }

        String[] strArray = number.split("");

        StringBuilder sb = new StringBuilder();
        if (isSign) {
            sb.append("-");
        }
        for (int i = strArray.length - 1; i >= 0; i--) {
            sb.append(strArray[i]);
        }

        try {
            return Integer.parseInt(new String(sb));
        } catch (NumberFormatException e) {
            return 0;
        }
    }
}

 

<  타인 답변 코드  >

 

class Solution {
    public int reverse(int x) {
        long rev= 0;
        while( x != 0){
            rev= rev*10 + x % 10;
            x= x/10;
            if( rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE)
                return 0;
        }
        return (int) rev;
    }
}

이것을 주의하자!


-  처음 이 문제를 접하고 프로그래머스에서 비슷한 문제를 풀었던 느낌이 왔다.  뭔가 공식만 있으면 쉽게 풀 것 같은데 그 공식이 생각이 안났다. 할수 없이 생각이 나는대로 코드를 짰다. Int 형으로 받아온 값을 String 으로 바꿔서 String[] 로 변환, 역순으로 다시 배치하도록 설계했다. 이렇게 작성하면서도 "뭔가 비효율적이야.. 다른 방법이 있을텐데" 고개를 저었다. 부호의 경우는 처음에 부호가 있으면 제외하도록 하고 이후 다시 붙이는 방식이다. 

 

-  역시 내 방식대로 실행하니 런타임 관련해서 '최악' 이다.

 

-  타인의 코드를 보면 정답이 나온다.  % 10 을 통해 뒷 자리부터 하나씩 뺀 다음, 이후 * 10을 해 앞자리로 더하도록 하는 방법이다. 이 방안이 교과서처럼 널리 사용되는 듯 하다. 이제 잊지 말자. 숫자의 역순을 구하는 건 공식이 있다!!

 

-  int 형의 크기를 넘는지 아닌지 확인하는 방법으론  Integer.MAX_VALUE ( )  /  Integer.MIN_VALUE ( )  메서드를 이용할 수 있다.  그러면 2,147,483,647  과  - 2,147,483,648  값이 나온다.