문제 개요
이번 글에서는 하나의 숫자를 입력받아, 그 숫자에 가장 가까운 2의 거듭제곱 값을 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 입력값이 365라면 결과는 256이 되어야 합니다. 256은 365에 가장 가까운 수 중에서 정수 n에 대해 2n 형태로 표현할 수 있기 때문입니다.
구현 코드
그럼 이 기능을 수행하는 함수의 코드를 작성해 보겠습니다.
const num = 365;
const nearestPowerOfTwo = num => {
// 음수가 아닌 숫자만 처리
if(num < 0){
num *= -1;
}
let base = 1;
while(base < num){
if(num - base < Math.floor(base / 2)){
return base;
};
base *= 2;
};
return base;
};
console.log(nearestPowerOfTwo(num));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
256
동작 원리
이 알고리즘은 다음과 같은 단계로 동작합니다.
1. 음수 처리: 입력값이 음수인 경우 절댓값으로 변환하여 양수만 다루도록 합니다.
2. 기준값 초기화: 변수 base를 1(즉, 2⁰)로 초기화한 뒤, 입력값보다 커질 때까지 계속 2배씩 곱해 나갑니다.
3. 거리 비교: 각 반복마다 현재 base와 입력값의 차이가 base의 절반보다 작은지 확인합니다. 이 조건이 참이라는 것은 입력값이 현재 base 쪽에 더 가깝다는 의미이므로, 즉시 base를 반환합니다.
4. 종료 조건: 반복문이 끝날 때까지 조건에 걸리지 않았다면, 마지막 base(입력값 이상의 최소 2의 거듭제곱)가 가장 가까운 값이므로 이를 반환합니다.
이처럼 반복문과 간단한 비교 연산만으로 원하는 결과를 효율적으로 얻을 수 있습니다.