알고리즘 기초 1/2. 301 - 수학 1(연습)
1212번. 8진수 2진수
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진수 값을 설정한 것이다.