문제 정의
우리는 0과 1로만 구성된 이진(binary) 배열을 입력으로 받는 JavaScript 함수를 작성해야 합니다.
이 함수는 먼저 배열에 있는 모든 비트를 하나의 이진수로 연결한 뒤, 그 이진수에 대응하는 십진수(10진수) 값을 반환해야 합니다.
예를 들어 [1, 0, 1, 1]이라는 배열이 주어지면, 이를 이진수 '1011'로 해석하고 그에 해당하는 십진수인 11을 반환하면 됩니다.
해결 방법
가장 기본적인 접근 방식은 각 비트의 자릿값을 계산하여 더하는 것입니다. 이진수에서 가장 왼쪽 비트부터 오른쪽으로 갈수록 2의 거듭제곱 지수가 하나씩 감소합니다. 따라서 배열을 순회하면서 값이 1인 자리에 대해 Math.pow(2, exponent)를 이용해 자릿값을 누적하면 됩니다.
예제 코드
const arr = [1, 0, 1, 1];
const binaryArrayToNumber = arr => {
let num = 0;
for (let i = 0, exponent = arr.length - 1; i < arr.length; i++) {
if (arr[i]) {
num += Math.pow(2, exponent);
}
exponent--;
}
return num;
};
console.log(binaryArrayToNumber(arr));실행 결과
11
동작 원리 설명
위 코드가 어떻게 동작하는지 단계별로 살펴보겠습니다.
- 배열
[1, 0, 1, 1]은 길이가 4이므로, 초기 지수(exponent)는 3으로 설정됩니다. - 첫 번째 요소가 1이므로
2³ = 8을 더합니다. - 두 번째 요소는 0이므로 아무것도 더하지 않습니다.
- 세 번째 요소가 1이므로
2¹ = 2를 더합니다. - 네 번째 요소가 1이므로
2⁰ = 1을 더합니다. - 최종적으로
8 + 0 + 2 + 1 = 11이 반환됩니다.
더 간결한 대안 방법
JavaScript의 내장 메서드를 활용하면 훨씬 짧은 코드로 같은 결과를 얻을 수 있습니다.
const binaryArrayToNumber = arr => parseInt(arr.join(''), 2);
console.log(binaryArrayToNumber([1, 0, 1, 1])); // 11arr.join('')은 배열의 모든 요소를 문자열 '1011'로 합치고, parseInt의 두 번째 인자로 2를 전달하여 이진수로 해석한 십진수를 반환합니다. 코드가 간결해지지만, 내부 동작 원리를 이해하기 위해서는 앞서 소개한 수학적 접근 방식도 함께 알아두는 것이 좋습니다.