문제 소개
다음 그림처럼 하나의 큰 직사각형 안에 5개의 정사각형이 차곡차곡 포개어 배치되어 있다고 가정해 보겠습니다.
이 정사각형들은 각 변의 길이가 1, 1, 2, 3, 5로 이어지는 피보나치 수열 구조를 띠고 있습니다. 따라서 각 정사각형의 둘레를 모두 더하면 다음과 같습니다.
4 + 4 + 8 + 12 + 20 = 48 단위
즉, 우리가 작성해야 할 것은 숫자 n을 입력받아, 직사각형 안에 n개의 정사각형이 배치되어 있을 때 전체 둘레의 합을 반환하는 JavaScript 함수입니다.
접근 방법
정사각형의 변의 길이가 피보나치 수열을 따르기 때문에, 배열에 수열의 값을 하나씩 추가하면서 동시에 누적합을 계산하는 방식으로 문제를 해결할 수 있습니다. 모든 변의 길이의 합을 구한 뒤 4를 곱하면 전체 둘레의 합이 됩니다.
예제 코드
const num = 6;
const findPerimeter = (num = 1) => {
const arr = [1, 1];
let n = 0;
let sum = 2;
for (let i = 0; i < num - 1; i++) {
n = arr[i] + arr[i + 1];
arr.push(n);
sum += n;
};
return sum * 4;
};
console.log(findPerimeter(num - 1));
실행 결과
80
코드 설명
배열 arr은 첫 두 정사각형의 변의 길이인 1과 1로 초기화하고, 변수 sum은 해당 값들의 합인 2로 시작합니다. 반복문에서는 앞의 두 항을 더한 새로운 피보나치 수를 배열에 추가하고, 동시에 누적합에 더해 줍니다. 반복이 끝나면 총합에 4를 곱해 전체 둘레의 합을 반환합니다.
위 예제에서는 변의 길이가 1, 1, 2, 3, 5, 8인 6개의 정사각형에 대한 둘레의 합, 즉 (1 + 1 + 2 + 3 + 5 + 8) × 4 = 80이 출력됩니다. 이처럼 피보나치 수열의 성질만 파악하면 반복문 하나로 간단하게 해결할 수 있는 문제입니다.