[자바스크립트/알고리즘] HackerRank - Flipping bits
728x90

Success Rate: 97.64%, 난이도: Basic 문제이다.

 

비트 연산으로 풀 수 있지만, 더 간단한 솔루션을 찾았다.

 

- 문제

32비트 unsigned 정수가 주어지면, 비트 1은 0으로, 비트 0은 1로 반전시키고 unsigned integer로 결과를 리턴하여라.

 

- 예시

[입력값]

3 
2147483647 
1 
0

[출력값]

2147483648 
4294967294 
4294967295

 

- 풀이

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', function(inputStdin) {
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString = inputString.split('\n');

    main();
});

function readLine() {
    return inputString[currentLine++];
}

/*
 * Complete the 'flippingBits' function below.
 *
 * The function is expected to return a LONG_INTEGER.
 * The function accepts LONG_INTEGER n as parameter.
 */

function flippingBits(n) {
    return (2**32)-1-n;
}

function main() {
    const ws = fs.createWriteStream(process.env.OUTPUT_PATH);

    const q = parseInt(readLine().trim(), 10);

    for (let qItr = 0; qItr < q; qItr++) {
        const n = parseInt(readLine().trim(), 10);

        const result = flippingBits(n);

        ws.write(result + '\n');
    }

    ws.end();
}

함수 flippingBits만 보면 된다.

이전에는 입력값을 루프를 돌며 비트를 반전시켜주었는데, 유튜브를 통해 더 간단한 풀이를 알게 되었다.

(2**32)-1을 이진수로 변환하면 11111111111111111111111111이고 여기서 주어진 수 n을 빼는 것은

주어진 숫자 n을 이진수로 변환하여 11111111111111111111111111111111에서 빼는 것과 같은 결과가 된다.

 

즉 전자로 계산한다면 십진수를 이진수로 변환하고 다시 십진수로 변환할 필요가 없다.

 

- 참고

 

320x100