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