개발👩💻/알고리즘
백준 js 1373: 2진수 8진수
gigibean
2021. 5. 8. 20:41
728x90
문제
2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.
입력
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.
예제 입력 1
11001100
예제 출력 1
314
풀이
2진수에서 8진수로 변환하면된다.
기존에 js에 있는 메서드들로,
toString(n) // 10진수를 n진수로 변환
parseInt(num, n) // n진수인 num을 10 진수로 변환
하는 방법으로 하려 했는데,
이는 input값이 Number 객체의 길이를 넘어감으로 안되고,
이진수 숫자를 뒤에서부터 세개씩 묶어서 각 자릿수곱해 더해주면 8진수로 변환 가능하다.
2가지 방법이 있다.
1️⃣ 비트 자릿수
각 비트를 3개씩 꺼내서 그 값에 각각 자릿수를 곱해준다.
맨앞에 비트의 개수가 2개 이하인 것들을 따로 처리해준다.
2️⃣ 비트 연산자⭐️
비트를 뒤에서부터 하나씩 꺼내서 비트 연산자를 사용해 비트를 옮겨가며 값을 구한다.
각 방법에 대한 코드를 보면
1️⃣ 비트 자리수 곱하기는
// input = 2진수 숫자 str
// result = ""
// 2진수 숫자 중 맨 앞 자리 수가 3으로 떨어지지 않을 경우
// 먼저 처리하여 result str 앞에 추가한다
if (input.length % 3 === 1) result += input[0]
else if (input.length % 3 === 2) result += parseInt(input[0]) * 2 + parseInt(input[1])
// 나머지 자리에 있는 각 비트들을 3자리씩 묶어서 각 비트에 해당하는
// 자릿수 곱해주고, 해당 값을 하나씩 result에 추가해준다
for (let i = input.length % 3; i < input.length; i++) {
result += parseInt(input[i]) * 4 + parseInt(input[i+1]) * 2 + parseInt(input[i+2])
}
2️⃣ 비트 연산자 사용해서 각 비트를 쉬프트하는 것은
// input = 각 비트를 담고 있는 배열
// result = []
while(input.length) {
let tmp = 0;
for (let i = 0; i < 3; i++) { // 세자리씩 결과 tmp에 담기
let eachchar = parseInt(input.pop()) // 마지막 비트 추출
if (!eachchar) continue // 0일 때는 아무것도 하지않고
tmp += 1 << i // ⭐️1일 때에는 1을 i 비트만큼 왼쪽으로 이동한 값을 더하기(자릿수 곱과 같은 원리)
}
// for 문내에서 8진수 한자리가 만들어졌으므로 result에 이 값을 추가
result.push(tmp)
}
console.log(result.reverse().join(""))
참고로 result.push(tmp)하고 reverse() 하는게 unshift() 하는 것보다 빠르다
그리고 1️⃣보다 2️⃣방법이 빠르다.
전체코드
반응형