문제 개요
한 변의 길이가 'a'인 정사각형이 하나 있다고 가정해 봅시다. 이 정사각형의 네 변에서 중점들을 찾아 서로 연결하면 그 안에 새로운 정사각형이 만들어집니다. 같은 방식으로 중점을 연결하는 작업을 n번 반복했을 때, n번째 정사각형의 넓이를 구하는 것이 이 글의 목표입니다.
풀이 접근
바깥쪽 첫 번째 정사각형의 한 변의 길이가 'a'이므로, 그 넓이는 다음과 같습니다.
A1 = a2
이제 피타고라스 정리를 활용해 보겠습니다. 각 변의 중점을 연결해 만든 두 번째 정사각형의 한 변은, 원래 정사각형의 한 변과 절반 지점을 잇는 선분에 해당하며 그 길이는 a/√2 입니다. 따라서 두 번째 정사각형의 넓이는 다음과 같습니다.
A2 = a2 / 2
같은 원리로 세 번째 정사각형의 넓이도 구할 수 있습니다.
A3 = a2 / 4
여기서 흥미로운 패턴을 발견할 수 있습니다. 중점을 연결할 때마다 정사각형의 넓이는 정확히 절반이 됩니다. 이 규칙을 일반화하면 n번째 정사각형의 넓이는 다음과 같습니다.
An = a2 / 2n−1
예제 코드
위 일반식을 C++ 코드로 구현하면 다음과 같습니다.
#include <iostream>
#include <cmath>
using namespace std;
float area(float a, float n) {
if (a < 0) // 값이 음수이면 유효하지 않음
return -1;
float area = (a*a) / pow(2, n-1);
return area;
}
int main() {
float a = 20.0, n = 10.0;
cout << "Area : " << area(a, n);
}
실행 결과
Area : 0.78125
한 변의 길이가 20인 정사각형에서 중점 연결을 10번 반복하면, 열 번째 정사각형의 넓이는 0.78125가 됩니다. 실제 계산으로 확인해 보면 202 ÷ 29 = 400 ÷ 512 = 0.78125로 실행 결과와 정확히 일치합니다.
마무리
이 문제의 핵심은 기하학적 규칙을 찾아 일반식을 세우는 것입니다. 매 단계마다 넓이가 절반이 된다는 사실만 파악하면, pow 함수를 활용해 반복문 없이 O(1) 시간 복잡도로 답을 구할 수 있습니다. 또한 입력값이 음수일 경우 -1을 반환하도록 처리하여 잘못된 입력에 대한 예외 처리도 함께 살펴볼 수 있습니다.