코딩 테스트 연습

[Leet Code Top 100] #190. Reverse Bits

쫑인스 2022. 1. 16. 20:49

문제 정보

 

해결 방법

bitwise 연산인 >>> 을 반복적으로 사용하면서 i 번째 자리에 숫자가 존재하는지 여부를 확인하고 2^(n-i) 를 반복해서 더해주는 방법으로 구현했습니다. 다른 제출된 답안들을 확인해 봐도 한 두 가지 방법을 제외하고는 (실제 구현하는 방법은 조금씩 다르겠지만) 컨셉은 비슷했습니다. 

 

소스 코드

// Leet Code
// #190. Reverse Bits
// Success
// Runtime: 103 ms, faster than 33.55% of JavaScript online submissions for Reverse Bits.
// Memory Usage: 40.6 MB, less than 49.41% of JavaScript online submissions for Reverse Bits.

function main(){
    // Input // Output
    n = 0b00000010100101000001111010011100; // 964176192 (00111001011110000010100101000000)

    console.log(reverseBits(n));
}

/**
 * @param {number} n - a positive integer
 * @return {number} - a positive integer
 */
var reverseBits = function(n) {
    
    let nCopy = n;
    let result = 0;
    let count = 32;
    let exp = 2**31;

    while(0 < count){
        //console.log(`nCopy:${nCopy.toString(2)} / exp:${exp} / count:${count} / result:${result}`);

        if(nCopy & 1) result += exp;
        nCopy = nCopy >>> 1;
        exp /= 2;
        count --;        
    }

    return result;
};

 

더 알아본 내용

var reverseBitsPractice = function(n) {
    //console.log(`toString:${n.toString(2)}`);
    //console.log(`join:${n.toString(2).split("").reverse("").join("")}`);
    //console.log(`padEnd:${n.toString(2).split("").reverse("").join("").padEnd(32, "0")}`);

    return Number.parseInt(n.toString(2)
                            .split("")
                            .reverse("")
                            .join("")
                            .padEnd(32, "0"), 2);
};

Disscuss 탭에 있던 한줄로 구현된 답인데 궁금해서 더 찾아봤더니 padEnd 라는 메소드로 32자리가 될 때 까지 0을 채워 넣을 수 있습니다. 문제의 의도(?) 에는 부합하지 않겠지만 가장 직관적인 풀이법인 것 같습니다.

 

참고 자료