문제 정의
다음과 같은 형태의 수열 합이 주어진다고 가정해 봅시다.
$$seq(n,\:p)=\displaystyle\sum\limits_{k=0} \square(-1)^{k}\times\:p\:\times 4^{n-k}\:\times(\frac{2n-k}{k})$$
우리가 해야 할 일은 두 개의 숫자 n과 p를 인자로 받아 위 수열의 값인 seq(n, p)를 계산하여 반환하는 JavaScript 함수를 작성하는 것입니다.
접근 방법
이 문제는 단순한 반복문만으로 충분히 해결할 수 있습니다. k를 0부터 n까지 하나씩 증가시키면서 각 항(term)을 계산하고, 그 값들을 모두 더하면 됩니다.
- k가 짝수일 때는 부호가 (+), 홀수일 때는 (−)가 적용됩니다.
- 각 항에는 4^(n−k)가 곱해지며, 이는 Math.pow() 함수로 쉽게 계산할 수 있습니다.
- 마지막 승수는 (2n − k) / k인데, k가 0일 때 0으로 나누는 오류를 피하기 위해 기본값으로 1을 사용합니다.
구현 코드
다음은 위 로직을 구현한 코드입니다.
const n = 12;
const p = 70;
const findSeqSum = (n, p) => {
let sum = 0;
for(let k = 0; k <= n; k++){
// k가 짝수면 +1, 홀수면 -1
const power = k % 2 === 0 ? 1 : -1;
// 4의 (n-k) 거듭제곱
const fourPower = Math.pow(4, (n - k));
// (2n - k) / k, k가 0일 때는 1로 대체
const multiplier = ((2 * n) - k) / (k || 1);
const term = (power * p * fourPower * multiplier);
sum += term;
};
return sum;
};
console.log(findSeqSum(n, p));코드 설명
- power: 삼항 연산자를 사용해 k의 홀짝 여부에 따라 교대 부호를 결정합니다.
- fourPower: Math.pow(4, n − k)로 각 항에 필요한 4의 거듭제곱을 구합니다.
- multiplier: (2n − k) / k 값을 계산하되,
(k || 1)패턴 덕분에 k가 0일 때 자동으로 1로 대체되어 NaN 오류를 방지합니다. - 모든 항을 sum 변수에 누적한 뒤 최종적으로 반환합니다.
출력 결과
위 코드를 실행하면 다음과 같은 콘솔 출력을 확인할 수 있습니다.
22131141616.42424
이처럼 반복문과 Math.pow()를 조합하면 복잡해 보이는 수열의 합도 간결하고 효율적인 코드로 계산할 수 있습니다.