[백준 | Javascript] 1212

박기영·2022년 9월 9일
0

백준

목록 보기
117/127
post-custom-banner

알고리즘 기초 1/2. 301 - 수학 1(연습)
1212번. 8진수 2진수

문제

1212번 문제 링크

solution

const fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split("").reverse();

let ans = [];

if(input.length === 1 && input[0] === "0"){
    console.log(0);
} else {
    // ["4","1","3"]
    for(let i = 0; i < input.length; i++){
        // "4"
        let octal = input[i];
    
        // parseInt로 "4"를 8진수로 바꾼다.
        // 8진수로 바꾼 수를 toString을 통해 2진수로 바꾼다.
        // 2진수로 바꾼 수의 길이가 3보다 작으면 앞에 0을 채워서 만들어준다.
        // "100"
        ans.push(parseInt(octal, 8).toString(2).padStart(3,0));
    }

    // ["011", "001", "100"]
    ans.reverse();

    // "011001100"
    let ansString = ans.join("");

    // 만약 맨 앞이 0으로 시작한다면
    while(ansString[0] === "0"){
        // 숫자 하나하나를 쪼개서 배열로 전환 후
        ansString = ansString.split("");

        // shift로 0을 빼준다.
        ansString.shift();

        // 다시 하나의 문자열로 만들어준다.
        // "11001100"
        ansString = ansString.join("");
    }
    
    console.log(ansString);
}

매서드를 이용하는 방법이 훨씬 깔끔해보인다.
그런데 메모리는 매서드를 사용한 쪽이 약간 더 크게 잡아먹었다.

무식한 방법

const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("").map((item) => Number(item));

let ans = [];

if(input == 0){
    console.log(0);
} else {
    // [3,1,4]
for(let i = 0; i < input.length; i++){
    // 3
    let octal = input[i];
    
    // 나머지. 0 or 1
    let remainder = octal % 2;
    
    // 몫. 0 or 1 or 2 or 3
    let quotient = (octal - remainder) / 2;
    
    let binary = [0,0,0];
    
    if(quotient === 3){
        binary[0] = 1;
        binary[1] = 1;
    } else if(quotient === 2){
        binary[0] = 1;
    } else if(quotient === 1){
        binary[1] = 1;
    } else {
        binary[2] = 1
    }
    
    if(remainder === 1){
        binary[2] = 1;
    } else {
        binary[2] = 0;
    }
    
    ans.push(binary.join(""));
}

ans = ans.join("").split("");

while(ans[0] === "0"){
    ans.shift();
}

console.log(ans.join(""));
}

이 방법은 직전 문제였던 2진수 8진수 문제와 동일한 방법을 사용한 것이다.
8진수 숫자 하나를 3개의 2진수로 표현을 하고자 한 것이다.
8진수는 0 ~ 7 사이의 값으로 표현되므로, 몫과 나머지를 이용해서
경우의 수를 따져서 일일이 2진수 값을 설정한 것이다.

참고 자료

참고 자료 1

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글