Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

정사각형의 중점을 반복해서 연결해 만든 n번째 정사각형의 넓이 구하기

문제 개요

한 변의 길이가 '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을 반환하도록 처리하여 잘못된 입력에 대한 예외 처리도 함께 살펴볼 수 있습니다.