[boj] 2089. -2진수

hy1as ㅣ 2023. 3. 20. 14:32

[boj] 2089. -2진수

 

2089번: -2진수

-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, 110

www.acmicpc.net

-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진수를 출력하는 프로그램을 작성하시오.

 


 

1. 문제 분석

10진수를 -2진수로 변환하는 문제입니다.
2진수 진법 변환 방식과 동일하게 진행합니다.
주의해야 할 점은 진법 전환 시 나오는 나머지가 $ -1 $ 이 나오게 됩니다.
때문에 나누기 연산 후 나머지가 1이 될 수 있도록 몫에 +1을 해주도록 합니다

 


 

2. 솔루션

const fs = require('fs')
let targetNumber = +fs.readFileSync(process.platform ===
                                   'linux' ? '/dev/stdin' : 'input.txt')
                     .toString().trim()
const answer = []
while (targetNumber !== 0) {
    if (targetNumber % -2 !== 0) {
        // 나머지가 -1 이 아닌 1이 나올 수 있도록한다.
        // ex) 13 / -2 =>  (-7) * (-2) ... -1 (x) ===  (-6) * (-2) ... +1 (o)
        // ex) -13 / -2 => (6) * (-2) ... -1 (x) === (7) * (-2) ... +1 (o)
        targetNumber = Math.floor(targetNumber / -2) + 1
        answer.push('1')
    } else {
        targetNumber = Math.floor(targetNumber / -2)
        answer.push('0')
    }
}

console.log(answer.length === 0 ? '0' : answer.reverse().join(''))

 


마치며

'-' 진법 계산의 경우 나머지의 부호에 유의하도록 합시다.

'알고리즘-문제풀이' 카테고리의 다른 글

[boj] 17413. 단어 뒤집기 2  (0) 2023.03.20
[boj] 17103. 골드바흐 파티션  (0) 2023.03.20
[boj] 1212. 8진수 2진수  (0) 2023.03.20
[boj] 1373. 2진수 8진수  (0) 2023.03.16
[boj] 17087. 숨바꼭질 6  (0) 2023.03.16