문제
JavaScript 함수를 하나 작성해야 합니다. 이 함수는 숫자 n을 입력받고, n보다 작거나 같은 모든 완전 세제곱수(perfect cube)의 합을 반환해야 합니다.
완전 세제곱수란 어떤 정수를 세 번 곱한 값으로 표현할 수 있는 수를 의미합니다. 예를 들어 1, 8, 27, 64는 각각 1³, 2³, 3³, 4³이므로 모두 완전 세제곱수에 해당합니다.
예시
다음은 해당 코드입니다 −
const num = 23546;
const sumPerfectCubes = (num = 1) => {
let i = 1;
let sum = 0;
while(i * i * i <= num){
sum += (i * i * i);
i++;
};
return sum;
};
console.log(sumPerfectCubes(num));
출력
164836
코드 설명
위 코드가 작동하는 방식은 다음과 같습니다.
- 변수
i를 1부터 시작하여 매번 1씩 증가시키며,i³이 입력값num이하인 동안 while 루프를 반복 실행합니다. - 각 반복에서 현재 세제곱 값(
i * i * i)을 변수sum에 누산합니다. i³이num을 초과하는 순간 루프가 종료되고, 지금까지 누적된 합계가 반환됩니다.
예제에서 num이 23546일 경우, 28³ = 21952이지만 29³ = 24389이므로 1³부터 28³까지만 합산 대상이 됩니다. 결과적으로 출력값은 164836입니다.
참고: 수학 공식을 활용한 방법
흥미롭게도 처음 n개의 자연수 세제곱의 합은 아래와 같은 잘 알려진 공식으로도 구할 수 있습니다.
sum = [n(n + 1) / 2]²
실제로 (28 × 29 ÷ 2)² = 406² = 164836으로, 위 코드의 결과와 정확히 일치합니다. 따라서 성능이 중요한 경우 반복문 없이 O(1) 시간 복잡도로 계산할 수 있다는 점도 기억해 두면 유용합니다.