문제 소개
중복되지 않는 음수가 아닌 정수 배열을 입력받아 하나의 32비트 정수를 반환하는 JavaScript 함수를 작성해야 합니다. 조건은 다음과 같습니다. 반환되는 정수의 이진 표현에서 배열에 포함된 인덱스(오른쪽부터 셈)에 해당하는 자리에만 1이 있어야 하며, 나머지 자리는 모두 0이어야 합니다.
예를 들어 배열이 [1, 2, 0, 4]라면, 오른쪽에서 0번째, 1번째, 2번째, 4번째 자리에만 1이 위치한 이진수를 만들어 그에 대응하는 값을 계산하게 됩니다.
예제 코드
다음은 위 문제를 해결하는 코드입니다 −
const arr = [1, 2, 0, 4];
const buildDecimal = (arr = []) => {
const bitArr = Array(31).fill(0);
let res = 0;
arr.forEach(el => {
bitArr.splice((31 - el), 1, 1);
})
bitArr.forEach((bit, index) => {
res += (2 * (31-index) * bit);
});
return res;
};
console.log(buildDecimal(arr));
출력 결과
콘솔에는 다음과 같이 출력됩니다 −
14
코드 동작 원리
이 코드의 핵심 로직은 크게 두 단계로 나눌 수 있습니다.
1단계 − 비트 배열 생성: 길이 31의 배열을 0으로 초기화한 뒤(Array(31).fill(0)), 입력 배열의 각 요소 el에 대해 splice(31 - el, 1, 1)를 호출하여 오른쪽 기준 el번째 위치에 해당하는 칸을 1로 바꿉니다. 이렇게 하면 요구 조건에 맞는 이진 패턴이 배열 형태로 완성됩니다.
2단계 − 10진수 값 계산: 완성된 비트 배열을 순회하면서 각 자리의 가중치를 결과값에 더해 최종적인 정수를 얻습니다. 마지막으로 console.log를 통해 결과를 확인할 수 있습니다.
이처럼 배열을 활용해 비트 자릿수를 직접 제어하면, 복잡한 비트 연산자 없이도 원하는 이진 패턴을 가진 정수를 손쉽게 구성할 수 있습니다.