Algorithm
[LeetCode] Reverse Integer
죠죠_
2023. 9. 14. 14:32
문제
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).
풀이
음수인 경우 '-' 처리하는게 귀찮을 것 같아서 abs
에 param으로 받은 x
의 절대값을 할당하고 시작했다. x
의 절대값인 abs
를 배열로 만들어 reverse()
로 순서를 뒤집어 준 다음. 앞서 체크한 음수 여부에 따라 음수인 경우에만 배열 맨 앞에 '-'를 넣어주었다.
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let isNegative = false;
const abs = Math.abs(x);
if (x < 0) {
isNegative = true;
}
const arry = Array.from(abs.toString()).map(Number).reverse();
if (isNegative) arry.unshift('-');
const result = parseInt(arry.join('').replaceAll(',',''));
return result
};
이렇게 완성된 array를 문자열로 바꾸어주면 끝날 줄 알았는데

???????????????
내가 작성한 코드는 32-bit 범위를 넘어가는 경우 오답을 뱉어낸다. JS에서 부호가 있는 32-bit의 정수의 범위는 [-2^31, 2^31 - 1]로 약 약 [-21억, 21억]에 해당한다. 따라서, 1534236469 는 위 범위를 벗어나는 숫자로 해당 숫자를 뒤집으면 overflow상태가 된다. 이런 변수를 관리하기 위해서는 result의 값이 지정 범위를 넘어서는지 여부를 확인해 주어야 한다.
if (result > 2 ** 31 - 1 || result < -(2 ** 31)) {
return 0;
}
다른 풀이
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
let nums = x.toString();
let arrayNums = nums.split("");
let reverseNums = arrayNums.reverse().join("");
if (parseInt(reverseNums) > 2147483647) return 0;
if (parseInt(reverseNums) < -2147483648) return 0;
if (x < 0) {
return parseInt(reverseNums) * -1;
}
return parseInt(reverseNums);
};