[boj] 2089. -2진수
- 문제 링크 : https://www.acmicpc.net/problem/2089
- 사용 언어 : Node.js
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 |