kakasoo

[node.js] 2진수 8진수 ( 백준 1373번 ) 본문

프로그래밍/알고리즘 풀이

[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이다.

이런 느낌으로 변환을 하면 된다.

반응형