본문 바로가기

개발👩‍💻/알고리즘

백준 js 1373: 2진수 8진수

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

 

전체코드

 

반응형

'개발👩‍💻 > 알고리즘' 카테고리의 다른 글

백준 js 2089: -2진수  (0) 2021.05.09
백준 js 1212: 8진수 2진수  (0) 2021.05.08
백준 js 17087: 숨바꼭질 6  (0) 2021.05.07
백준 js 6913: GCD 합  (0) 2021.05.07
백준 js 2004: 조합 0의 개수  (0) 2021.05.06