이번 글에서는 숫자 하나를 한계값(limit)으로 받아, 그 값보다 작은 피보나치 수 중 짝수에 해당하는 항들만 골라 합산한 결과를 반환하는 JavaScript 함수를 만들어 보겠습니다.
문제 이해하기
피보나치 수열은 첫 두 항이 0과 1이며, 그 뒤의 모든 항은 바로 앞의 두 항을 더한 값으로 이루어집니다. 즉, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 와 같은 형태로 진행됩니다.
여기서 우리가 원하는 것은 이 수열 중에서 짝수인 항만 추출하여, 주어진 한계값을 넘지 않는 범위 내에서 모두 더하는 것입니다.
예시
한계값이 100이라고 가정해 보겠습니다. 그러면 100 미만의 짝수 피보나치 항은 다음과 같습니다.
2, 8, 34
따라서 함수가 반환해야 하는 최종 결과는 다음과 같습니다.
44
구현 코드
아래 코드는 반복문을 사용하여 피보나치 수열을 생성하고, 각 항이 짝수인지 검사한 후 조건에 맞는 값만 누적합에 더하는 방식으로 동작합니다.
const sumOfEven = (limit) => {
let temp, sum = 0, a = 0, b = 1;
while (b < limit) {
if (b % 2 === 0) {
sum += b;
};
temp = a;
a = b;
b += temp;
};
return sum;
};
console.log(sumOfEven(100));
console.log(sumOfEven(10));
console.log(sumOfEven(1000));코드 동작 원리
코드의 핵심 로직을 단계별로 살펴보면 다음과 같습니다.
1. 변수 초기화: a와 b는 각각 피보나치 수열의 연속된 두 항을 나타내며, 초깃값은 0과 1입니다. sum은 짝수 항의 누적합을 저장합니다.
2. 반복 조건: b가 한계값보다 작은 동안만 반복합니다. 덕분에 한계값 이상의 항은 계산 대상에서 자연스럽게 제외됩니다.
3. 짝수 판별: 나머지 연산자(%)를 사용해 b % 2 === 0일 때, 즉 현재 항이 짝수일 때만 sum에 값을 더합니다.
4. 다음 항 계산: 임시 변수 temp에 이전 항을 저장한 뒤, 두 변수를 교체하고 새로운 항을 만들어 수열을 전진시킵니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 표시됩니다.
44 10 798
각 출력값을 확인해 보면 다음과 같습니다.
- sumOfEven(100): 2 + 8 + 34 = 44
- sumOfEven(10): 10 미만의 짝수 항은 2와 8뿐이므로 2 + 8 = 10
- sumOfEven(1000): 1000 미만의 짝수 항인 2, 8, 34, 144, 610을 모두 더한 값 = 798
마무리
이처럼 간단한 반복문과 조건문만으로도 피보나치 수열에서 짝수 항의 합을 효율적으로 구할 수 있습니다. 시간 복잡도는 수열의 항 개수에 비례하는 O(n) 수준으로, 실용적인 입력 범위에서는 충분히 빠르게 동작합니다.