알고리즘 기초 1/2. 301 - 수학 1(연습)
1373번. 2진수 8진수
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("").map((item) => Number(item));
let ans = [];
// input = [1,1,0,0,1,1,0,0]
while(input.length > 0){
let twoTo8;
// 3개 이상이면 뒤에서부터 3개를 잘라내고
// 3개 미만이면 앞에서부터 남은 개수 전부를 잘라낸다.
if(input.length >= 3){
// [1,0,0]
twoTo8 = input.splice(input.length - 3, 3);
} else {
twoTo8 = input.splice(0, input.length);
}
let sum = 0;
// [0,0,1]
twoTo8.reverse();
for(let i = 0; i < twoTo8.length; i++){
// 0 * 1, 0 * 2, 1 * 4
let binary = twoTo8[i] * (2 ** i);
sum += binary;
}
// 4
ans.push(sum);
}
// [4,1,3] -> [3,1,4] -> "314"
console.log(ans.reverse().join(""));
이번 문제는 2진수 -> 8진수로 전환하는 방법을 알면 쉽게 만들 수 있다.
방법은 아래와 같다.
2진수 : 11001100
8진수 : 314
2진수 -> 8진수
1. 2진수를 뒤에서부터 3자리씩 끊어낸다.
11, 001, 100
2. 끊어낸 숫자에 2진법 계산을 적용한다.
11 = 1*2, 1*1 = 3
001 = 0*4, 0*2, 1*1 = 1
100 = 1*4, 0*2, 0*1 = 4
3. 이들을 조합한다.
314
필자는 계산의 편의를 위해 3개씩 끊어낸 배열을 reverse해서
2진수 숫자와 2의 i 제곱을 곱해준 값을 sum에 더하여, 총합을 구하는 것으로 구현했다.