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

C++로 타원에 내접하는 가장 큰 정사각형의 넓이 구하기


문제 개요

이번 글에서는 주어진 타원 안에 내접할 수 있는 가장 큰 정사각형의 넓이를 구하는 방법을 알아보겠습니다. 두 반축의 길이 a와 b로 표현되는 타원이 주어졌을 때, 그 안에 그릴 수 있는 정사각형 중 면적이 최대인 것의 크기를 수학적으로 유도한 뒤, 이를 C++ 코드로 구현해 보겠습니다.

수학적 접근

중심이 원점에 있고 반축의 길이가 각각 a, b인 타원의 방정식은 다음과 같습니다.

x2/a2 + y2/b2 = 1

참고로 이 타원 전체의 넓이는 πab 입니다.

타원에 내접하는 정사각형은 원점을 기준으로 대칭이므로, 한 꼭짓점의 좌표를 (x, y)라고 할 수 있습니다. 도형이 정사각형이 되려면 두 좌표값이 서로 같아야 하므로, 방정식에 x = y를 대입합니다.

x2/a2 + x2/b2 = 1
양변에 a2b2를 곱하면,
x2(a2 + b2) = a2b2
따라서 x = ab / √(a2 + b2)

정사각형의 한 변의 길이는 2x이므로, 내접할 수 있는 가장 큰 정사각형의 넓이는 다음과 같이 정리됩니다.

A = (2x)2 = 4a2b2 / (a2 + b2)

C++ 구현 예제

#include <iostream>
#include <cmath>
using namespace std;

float area(float a, float b) {
    if (a < 0 || b < 0) // 값이 음수이면 유효하지 않음
        return -1;
    float result = (4 * a * a * b * b) / (a * a + b * b);
    return result;
}

int main() {
    float a = 4, b = 2;
    cout << "Area : " << area(a, b);
    return 0;
}

실행 결과

Area : 12.8

코드 설명

  • 입력값 검증: a 또는 b가 음수이면 타원을 정의할 수 없으므로 -1을 반환하여 잘못된 입력임을 알립니다.
  • 공식 적용: 위에서 유도한 공식 A = 4a2b2 / (a2 + b2)를 그대로 코드로 옮겼습니다. 예제에서 a = 4, b = 2일 때 4 × 16 × 4 ÷ 20 = 12.8이 계산됩니다.
  • 복잡도: 단순 산술 연산만 수행하므로 시간 복잡도와 공간 복잡도 모두 O(1)입니다.