프로그래밍/알고리즘 풀이
[node.js] 2진수 8진수 ( 백준 1373번 )
카카수(kakasoo)
2021. 4. 5. 20:47
반응형
두 개의 코드를 제공한다. 그 외에도 틀린 경우가 많았지만, 가장 대표적인 틀린(?) 코드와, 정답을 작성한다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
main(line);
rl.close();
}).on("close", () => {
process.exit();
});
/**
*
* @param {string} line
*/
const main = (line) => {
// 1. 2진수를 10진수로 변환한다.
let ten = BigInt(0);
for (let i = 0; i < line.length; i++) {
const cur = line[i] * 2 ** (line.length - i - 1);
ten += BigInt(cur);
}
// 2. 10진수를 8진수로 변환한다.
const numbers = [];
let square = 0;
while (ten >= 8) {
const value = ten % BigInt(8);
numbers.push({ value: value, square: square++ });
ten = ten / BigInt(8);
}
numbers.push({ value: ten, square: square++ });
// 3. 숫자 부분을 이어서 출력해준다.
let answer = "";
numbers.reverse().forEach((el) => (answer += el.value));
console.log(answer);
};
위 코드로도 정답을 구할 순 있었다. 다만, 범위가 문제가 되었다.
기존에 진법 계산하듯 계산을 하기 위해서 2진수를 10진수로 바꾸었고, 그것을 다시 8진수로 바꾸어 주었다.
여기서 다만 이 숫자가 너무 커서 연달아 문제가 발생하였고, 따라서 line을 BigInt로 해야 한다고 생각했다.
다만 BigInt로 변환하더라도 숫자가 큰 건 마찬가지라 풀 수 없었다.
따라서 2진수에서 10진수로 변환하면 안 된다는 것을 알았다.
( 아니면 10진수로 변환할 때도 문자열처럼 변환을 해야 했을 것이다. )
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
main(line);
rl.close();
}).on("close", () => {
process.exit();
});
/**
*
* @param {string} line
*/
const main = (line) => {
const numbers = [];
while (line.length > 3) {
numbers.push(line.substr(line.length - 3, 3));
line = line.substr(0, line.length - 3);
}
numbers.push(line);
let answer = "";
numbers.reverse().forEach((el) => {
const ten = parseInt(el, 2);
const hex = ten.toString(8);
answer += hex;
});
console.log(answer);
};
그래서 2진수를 8진수로 바로 변환하는 코드를 작성하였다.
똑같이 문자열로 다루되, 중간에 10진수로 변환하지 않는다.
2진수에서 8진수로 넘어가는 특성 상 3자리 씩 자르면 변환할 수 있다.
예컨대,
2진수 100은 8진수로 1이다.
2진수 1 000은 8진수로 1 0이다.
2진수 10 000은 8진수로 2 0이다.
이런 느낌으로 변환을 하면 된다.
반응형