반응형
728x90
반응형
문제
https://leetcode.com/problems/reverse-integer
풀이코드
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;
}
반응형
'Algorithm > Problem Solving' 카테고리의 다른 글
[leetcode] Medium-12번. Integer to Roman 문제풀이 (0) | 2021.11.02 |
---|---|
[leetcode] Medium-11번. Container With Most Water 문제풀이 (0) | 2021.10.26 |
[leetcode] Medium-6번. ZigZag Conversion 문제풀이 (0) | 2021.10.22 |
[leetcode] Medium-4번. median-of-two-sorted-arrays 문제풀이 (0) | 2021.10.20 |
[leetcode] Medium-5번. Longest_Palindromic_Substring 문제풀이 (0) | 2021.10.19 |