개발👩‍💻/알고리즘

백준 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️⃣방법이 빠르다.

 

전체코드

 

반응형