개발👩💻/알고리즘
백준 js 2089: -2진수
gigibean
2021. 5. 9. 16:48
728x90
문제
-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.
10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 10진법으로 표현된 수 N이 주어진다.
출력
-2진법 수를 출력한다.
제한
- -2,000,000,000 ≤ N ≤ 2,000,000,000
풀이
-2진수는 결국, -2를 자릿 수 대로 나누는데, 이는 -2를 자릿수만큼 제곱해주는 것과 같다.
(-2)^n(=자릿수)
13이라고 할 때 -2진수 표현은 11101인데
계산해보면
(-2)^4 + (-2)^3 + (-2)^2 + (-2) ^0
= 16 + (-8) + (4) + 1 = 13
한번 -2 를 나눴을 때 나머지가 있으면 마지막 자릿수 1이 있어야하니까 나머지만큼을 더해준다.
그다음 -2를 나누면 -2^2과 같다. 4만큼 나눴는데 1이 남는다면 -2가 필요하다는 의미이므로 자릿수에 +1을 해준다.
반대로 말하면 나누어 떨어진다면 해당자리 다음 자리에 1이 오고 현 자리는 0이 와야하는 것을 이야기한다.
그렇게 각 자리를 채우는데,
주어진 값을 자릿수만큼 뺀 걸 빼주어야하는데, 당연히 현재 자릿수 이후에 얼만큼 남았는지를 나타내야 함으로
n / -2를 해준다.
그리고 이 값을 js는 소숫점 값으로 변환할 수 있으니 Math.ceil을 해준다.
전체코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fs = require("fs"); | |
let n = | |
process.platform === "linux" | |
? fs.readFileSync("/dev/stdin").toString().trim() | |
: `-13`; | |
let result = ""; | |
if (n === 0) result += 0; | |
while (n != 0) { | |
result += Math.abs(n % -2); | |
console.log(result, n); | |
n = Math.ceil(n / -2); | |
console.log(n); | |
} | |
if (result) console.log(result.split("").reverse().join("")); | |
else console.log(0); |
반응형