[LeetCode] Reverse Integer (JS)

10779 단어 algorithmalgorithm

문제

Given a 32-bit signed integer, reverse digits of an integer.

Note:
Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

입출력 예
Input: x = -123
Output: -321

접근

어제 atoi문제를 했었는데 이와 비슷한 방법으로 풀 수 있을 것 같았다.
1. 부호를 저장할 변수 sign과 인덱스를 나타낼 변수 i, 역 정수를 하나씩 저장할 변수 resultNum을 만든다.
2. 파라미터 x로 들어오는 전달인자를 문자열로 변경하고 부호가 '-'가 있는지 판단한다. 있으면 sign을 -1로 변경하고 i++
3. for문을 이용한 반복을 하는데, j는 x의 길이 부터 i까지 감소한다. 이때 resultNum = resultNum * 10 + (x[j] - '0');
4. resulNum이 INT범위 내인지 확인하고 return.

풀이

var reverse = function(x) {
    x = x + '';
    let i = 0;
    let resultNum = 0
    let sign = 1;
    if(x[i] === '-'){
        sign = -1;
        i++;
    }
    for(let j = x.length - 1; j >= i; j--){
        resultNum = resultNum * 10 + (x[j] - '0');
    }
    if (resultNum * sign < Math.pow(2,31) - 1 && resultNum * sign > -Math.pow(2,31)){
        return resultNum * sign;
    }else{
        return 0;
    }
};

테스트에 통과하지만 x는 정수 이므로 사실 위의 단계를 거칠 필요가 없다... 수정한 코드는 아래와 같다.

var reverse = function(x) {
    
    let reverseNum = 0;
    while(x !== 0){
        reverseNum = reverseNum * 10 + x % 10;
        x = parseInt(x / 10);
    }
    return (reverseNum < Math.pow(2,31) - 1 && reverseNum > -Math.pow(2,31)) ? reverseNum : 0;
    
};

line갯수는 확연히 줄어들었고 더 간결한 것 같다. x가 정수이기 때문에 위와 같은 방법으로 작성하면 부호에 관계없이 잘 작동한다.

다른 방법

직접적으로 while이나 for를 사용하지 않고 메소드들을 사용하여 해결하는 방법 역시 있다.

var reverse = function(x) {
    let reverseNum = parseInt(Math.abs(x).toString().split('').reverse().join('')) * Math.sign(x);
    return (reverseNum < Math.pow(2,31) - 1 && reverseNum > -Math.pow(2,31)) ? reverseNum : 0;
};

좋은 웹페이지 즐겨찾기