이번 글에서는 하나의 숫자를 입력받아, 그 숫자에 가장 가까운 2의 거듭제곱(2^n) 값을 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 입력값이 145라면, 출력 결과는 128이 되어야 합니다. 왜냐하면 128은 2^7로 표현할 수 있으며, 145와 가장 가까운 거리에 있는 2의 거듭제곱이기 때문입니다.
동작 원리
알고리즘의 핵심 로직은 다음과 같습니다.
- 음수가 입력될 경우 절댓값으로 변환하여 양수만 처리합니다.
- base 값을 1부터 시작해 계속 2배씩 늘려가며 비교합니다.
- 현재 base와 다음 base 사이에서 입력값이 어느 쪽에 더 가까운지 판단하여, 더 가까운 쪽을 반환합니다.
예제 코드
const num = 145;
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));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
128
코드 설명
함수 내부에서는 base 변수를 1(2^0)로 초기화한 뒤, 반복문을 통해 1 → 2 → 4 → 8... 순으로 2배씩 증가시킵니다.
조건식 num - base < Math.floor(base / 2)는 현재 base와 입력값의 차이가 base의 절반보다 작은지 확인합니다. 만약 그렇다면, 다음 거듭제곱(base * 2)보다 현재 base가 입력값에 더 가깝다는 의미이므로 즉시 base를 반환하고 반복을 종료합니다.
입력값이 정확히 2의 거듭제곱인 경우에는 while 조건(base < num)이 성립하지 않으므로, 반복문이 종료된 후 해당 값 자체가 그대로 반환됩니다. 예를 들어 64를 입력하면 64가 그대로 출력됩니다.