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);
};