[leetcode] Medium-7번. Reverse Integer 문제풀이

반응형
728x90
반응형

문제

https://leetcode.com/problems/reverse-integer

 

Reverse Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

 

풀이코드

class Solution {
    public int reverse(int x) {
        long result = 0; // int) 1534236469 잘못된 결과 
        
        while (x != 0) { // X 가 0이라면 마지막까지 계산 종료 
            int target = x; 
            target = x % 10;  // 10 으로 나눈 나머지가 마지막 숫자 
            
            x = x / 10;
            
            result = (result * 10) + target; // 123) 0 + 3, (3 * 10) + 2, (32 * 10) + 1
        }

        if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        
        return (int) result;
    }
}

 

 

 

 

실패코드 (첫번째 풀이 방법)

public int reverse(int x) {
    String s = String.valueOf(x);
    String result = "";
    
    boolean isMinus = false;
    if (s.charAt(0) == '-') {
        isMinus = true;
    }

    for (int i = s.length() - 1; i >= 0; i--) {
        if (isMinus) {
            if (i == 0) {
                continue;
            }
        }
        
        result += s.charAt(i);
    }
    
    Integer resultInt = Integer.valueOf(result);
    if (isMinus) {
        resultInt = resultInt * (-1);
    }
    
    if (resultInt > Integer.MAX_VALUE || resultInt < Integer.MIN_VALUE) {
        return 0;
    }
    
    return resultInt;
}

 

처음에는 Integer 을 String 으로 변환하여 풀이할 생각을 했지만, 이 방법으로 풀면 아래와 같은 에러가 발생한다.

 

java.lang.NumberFormatException: For input string: "9646324351" at line 68, java.base/java.lang.NumberFormatException.forInputString at line 658, java.base/java.lang.Integer.parseInt at line 989, java.base/java.lang.Integer.valueOf at line 21, Solution.reverse at line 54, __DriverSolution__.__helper__ at line 84, __Driver__.main

 

해당 에러가 발생하는 이유는 int의 최대 값은 2^31 - 1인데, Integer.parseInt()를 사용하여 "9646324351" 문자열을 int로 변환하는 것은 불가능하기 때문이다. 이런 경우에는 0을 리턴할 수 있도록 문제에서도 설명되어있는 경우가 많은데 try~catch 로 0을 리턴해줄 수도 있다.

 

문제 내용 중
If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 
0.

 

대신 결과는 성공이여도 처리 시간이 14 ms가 걸린다. (참고로, 위 정답코드는 1 ms가 걸렸다.)

try~catch 추가
public int reverse(int x) {
    String s = String.valueOf(x);
    String result = "";
    
    boolean isMinus = false;
    if (s.charAt(0) == '-') {
        isMinus = true;
    }

    for (int i = s.length() - 1; i >= 0; i--) {
        if (isMinus) {
            if (i == 0) {
                continue;
            }
        }
        
        result += s.charAt(i);
    }
    
    Integer resultInt = 0;
    
    /* try~catch 추가하여 범위를 넘을경우 0 설정 */
    try {
        resultInt = Integer.valueOf(result);
    } catch (NumberFormatException nf) {
        resultInt = 0;
    }
    
    if (isMinus) {
        resultInt = resultInt * (-1);
    }
    
    if (resultInt > Integer.MAX_VALUE || resultInt < Integer.MIN_VALUE) {
        resultInt = 0;
    }
    
    return resultInt;
}

 

 

반응형

Designed by JB FACTORY