문제 개요
이 글에서는 정삼각형에 내접한 정사각형 내부에 그릴 수 있는 가장 큰 르로 삼각형(Reuleaux Triangle)의 넓이를 구하는 방법을 알아봅니다.
르로 삼각형은 세 개의 원호로 이루어진 곡선 삼각형으로, 어느 방향으로 재더라도 폭이 항상 일정한 성질을 가진 대표적인 등폭 곡선입니다. 이러한 특성 때문에 정사각형 안에 가장 크게 배치할 때 르로 삼각형의 높이 h는 정사각형의 한 변의 길이 x와 같아집니다.
편의상 정삼각형의 한 변의 길이를 a, 정사각형의 한 변의 길이를 x, 르로 삼각형의 높이를 h라고 정의합니다.
x 값 유도하기
정삼각형의 높이는 (√3 / 2)a입니다. 정사각형이 정삼각형의 밑변 위에 놓이고 윗쪽 두 꼭짓점이 삼각형의 두 변에 닿는다고 할 때, 닮은 삼각형의 비를 이용하면 다음 관계식을 얻습니다.
x = a · H / (a + H), 단 H = (√3 / 2)a
이 식을 정리하면 x의 값은 다음과 같습니다.
x = √3·a / (2 + √3) ≈ 0.464a
르로 삼각형의 넓이 공식
르로 삼각형의 높이는 정사각형의 한 변과 같으므로 h = x = 0.464a입니다. 폭이 h인 르로 삼각형의 넓이는 다음 공식으로 계산됩니다.
A = ((π − √3) / 2) × h²
여기에 h = 0.464a를 대입하면 최종 넓이 공식은 다음과 같습니다.
A = ((π − √3) / 2) × (0.464a)²
C++ 예제 코드
#include <iostream>
#include <cmath>
using namespace std;
float areaReuleaux(float a) { // 삼각형의 한 변의 길이는 a
if (a < 0) // a가 음수이면 유효하지 않음
return -1;
float area = ((3.1415 - sqrt(3)) * (0.464*a) * (0.464*a)) / 2;
return area;
}
int main() {
float side = 5;
cout << "Area of Reuleaux Triangle: " << areaReuleaux(side);
}실행 결과
Area of Reuleaux Triangle: 3.79311
복잡도 분석
이 알고리즘은 주어진 변의 길이 a에 대해 상수 번의 산술 연산만 수행하므로 시간 복잡도는 O(1), 추가로 사용하는 메모리도 상수 공간이므로 공간 복잡도 역시 O(1)입니다.