[boj] 1373. 2진수 8진수

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

 

1. 문제 분석

2진수를 8진수로 변환하는 문제입니다. 
8진법으로 나타낸 수의 각 자릿수는 2진법 3자리와 매칭하여 변환할 수 있습니다.
$ 8^1 = 2^3 $
앞에서부터 3자리씩 끊어 변환한다면 어렵지 않게 풀이할 수 있을 듯합니다.
하지만 이 문제에는 복병이 하나 있습니다.
"수의 길이가 1,000,000 넘지 않는다."
"이 문장은 길이의 최댓값이 1,000,000이다"와 같습니다.
$ 2^{99 * 10^6} $ 은 프로그래밍 언어 자료형으로 담기에 지나치게 큰 수입니다.
배열에 담기에도 원소가 많습니다.
때문에 문자열 상태에서 3자리씩 잘라 변환 후 다시 문자열로 완성하도록 합니다.

 


 

2. 솔루션

(1) 실패 - 메모리 초과 ( 스택 크기 )

 

const fs = require('fs')
let binaryNumbers = fs.readFileSync(process.platform ===
                                    'linux' ? '/dev/stdin' : 'input.txt')
                      .toString().trim()

 function binaryToOctet(binaryNumberArray, remainder = 0) {
     if(binaryNumberArray.length === 0) return ''
     let ret = 0
     if (remainder > 0) {
         let cursor = remainder
         while (cursor > 0) {
             ret += binaryNumberArray[2 - cursor] * 2 ** (cursor - 1)
             cursor--
         }
     } else {
         ret = binaryNumberArray[0] * 2 ** 2 + binaryNumberArray[1] * 2 +
               binaryNumberArray[2]
     }
     return ret.toString() + binaryToOctet(binaryNumberArray.slice(remainder === 0 ? 3 : remainder))
 }

 console.log(binaryToOctet(binaryNumbers, binaryNumbers.length % 3))

 

(2) 성공

 

const fs = require('fs')
let binaryNumbers = fs.readFileSync(process.platform ===
                                    'linux' ? '/dev/stdin' : 'input.txt')
                      .toString().trim()
let answer = ''

const remainder = binaryNumbers.length % 3;
if (remainder === 2) {
    answer += (+binaryNumbers.slice(0, 1) * 2 +
               +binaryNumbers.slice(1, 2)).toString(8)
} else if (remainder === 1) {
    answer += (+binaryNumbers.slice(0, 1)).toString(8)
}

for (let i = remainder; i < binaryNumbers.length; i += 3) {
    answer += (+binaryNumbers.slice(i, i + 1) * 4 +
               +binaryNumbers.slice(i + 1, i + 2) *
               2 + +binaryNumbers.slice(i + 2, i + 3)).toString(8)
}

console.log(answer)

마치며

문제 풀이 시 주어진 데이터 크기를 확인하고 메모리 초과가 일어나지 않도록 주의합시다.

'알고리즘-문제풀이' 카테고리의 다른 글

[boj] 2089. -2진수  (0) 2023.03.20
[boj] 1212. 8진수 2진수  (0) 2023.03.20
[boj] 17087. 숨바꼭질 6  (0) 2023.03.16
[boj] 9613. GCD 합  (0) 2023.03.16
[boj] 2004. 조합 0의 개수  (0) 2023.03.15