문제
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 [-2^31, 2^31 - 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
Constraints:
- -2^31 <= x <= 2^31 - 1
https://leetcode.com/problems/reverse-integer
풀이
숫자 순서를 바꾸는 거에 대해, String으로 변환하여 reverse 시키는 방법과 숫자 그대로 진행하는 방식 2가지로 진행해보았다.
문제를 보고 처음 들었던 생각이 '순서'를 바꾸는거라 String으로 푸는 방법이 생각났는데, 진행하다보니 숫자의 마지막을 계속해서 자리수를 높혀가면 될 것 같아서 int로도 코드를 짜보았다.
int의 경우 1의 자리의 수를 저장 후 10으로 나눠서 저장한 1의 자리의 수 삭제 및 다음 1의 자리의 수를 만들고, 저장할 변수는 게속해서 10을 곱해주면서 1의 자리의 수를 저장할 수 있도록 했다.
10으로 더이상 나눌 값이 없어지면 0이 나올거기 때문에 while(x != 0)을 통해 입력값의 자리수만큼 진행하도록 했다.
중간에 생겼던 문제로는 제한사항(-2^31 <= x <= 2^31 - 1)을 맞추는 것 이었는데,
String의 경우 'NumberFormatException'의 integer 파싱 에러가 발생하여 단순히 try catch로 처리할 수 있었던 반면에 int의 경우 범위를 넘어가는 경우 에러가 없었기 때문에 방안을 생각하는데 코딩 시간 소요가 컸다.
이에 대한 해결으로 저장용 변수 값의 이전 값이 실제 이전 값과 동일한가에 대한 체크를 진행했는데, int 범위를 넘어서면 Integer.MIN_VALUE(-2^31)나 Integer.MAX_VALUE(2^31-1)부터 시작될거기 때문에 실제 이전 값이 나오지 않을거라 생각했다.
코드
StringBuilder를 통한 reverse를 통해 진행한 방법
class Solution {
public int reverse(int x) {
int res = 0;
StringBuilder sb = new StringBuilder(Integer.toString(x));
sb = sb.reverse();
if(x < 0) {
sb.insert(0, '-');
sb.deleteCharAt(sb.length() - 1);
}
try {
res = Integer.parseInt(sb.toString());
} catch (NumberFormatException e) {
return 0;
}
return res;
}
}
1의 자리 숫자 지속 계산을 통해 진행한 방법
class Solution {
public int reverse(int x) {
int res = 0;
int next = 0;
while(x != 0) {
next = (res * 10) + (x % 10);
if((next - (x % 10)) / 10 != res) {
return 0;
}
x /= 10;
res = next;
}
return res;
}
}
결과
String 진행 : runtime 2ms, memory 40.99MB
int 진행(1의 자리수) : runtime 0ms / memory 40.74MB
개인적으로 StringBuilder의 reverse를 사용하게 되면 시간이 더 빠를 줄 알았는데, 양끝 swap을 위한 index 계산이랑 swap하는데 시간이 더 걸리는건가 싶다...
'LeetCode' 카테고리의 다른 글
10. Regular Expression Matching (0) | 2024.11.18 |
---|---|
8. String to Integer (atoi) (0) | 2024.11.12 |
6. Zigzag Conversion (1) | 2024.11.05 |
5. Longest Palindromic Substring (0) | 2022.02.14 |
4. Median of Two Sorted Arrays (0) | 2022.02.06 |