이 문제에서는 직각삼각형의 빗변(H)과 넓이(A) 두 값이 주어지며, 이를 바탕으로 직각삼각형의 나머지 두 변의 길이를 구하는 것이 목표입니다.
직각삼각형(Right Angled Triangle)은 두 변이 서로 직각(90도)으로 만나는 특수한 형태의 삼각형입니다.
예시를 통해 문제를 살펴보겠습니다.
입력 : H = 7 , A = 8
출력 : 높이(height) = 2.43, 밑변(base) = 6.56
해결 접근 방법
이 문제는 수학적 공식을 활용하면 간단하게 해결할 수 있습니다. 공식을 하나씩 유도해 보겠습니다.
직각삼각형의 넓이와 피타고라스 정리는 다음과 같습니다.
A = (1/2) × h × b (넓이 공식)
H² = h² + b² (피타고라스 정리)
여기서 h는 높이(perpendicular), b는 밑변(base), H는 빗변(hypotenuse)입니다.
(h + b) 값 구하기
완전제곱 공식을 활용하면,
(h + b)² = h² + b² + 2hb
앞서 구한 두 식을 대입하면 2hb = 4A이므로,
(h + b)² = H² + 4A
h + b = √(H² + 4A)
(h − b) 값 구하기
마찬가지로 완전제곱 공식을 적용하면,
(h − b)² = h² + b² − 2hb
(h − b)² = H² − 4A
h − b = √(H² − 4A)
두 식을 연립하여 풀이
이제 위에서 구한 두 개의 방정식을 얻었습니다.
두 식을 더하면,
2h = √(H² + 4A) + √(H² − 4A)
h = [√(H² + 4A) + √(H² − 4A)] / 2
두 식을 빼면,
2b = √(H² + 4A) − √(H² − 4A)
b = [√(H² + 4A) − √(H² − 4A)] / 2
이렇게 유도한 두 공식에 값을 대입하면 높이 h와 밑변 b를 구할 수 있습니다. 단, H² < 4A인 경우에는 실수 범위에서 해가 존재하지 않으므로 예외 처리가 필요합니다.
구현 예제
아래 프로그램은 위 해결 방법이 실제로 동작하는 모습을 보여줍니다.
#include <iostream>
#include <math.h>
using namespace std;
void findDimensionsRightTriangle(int H, int A) {
if (H * H < 4 * A) {
cout<<"Not Possible\n";
return;
}
float val1 = (float)sqrt(H * H + 4 * A);
float val2 = (float)sqrt(H * H - 4 * A);
float b = (float)(val1 + val2) / 2.0;
float p = (float)(val1 - val2) / 2.0;
cout<<"Perpendicular = "<<p<<endl;
cout<<"Base = "<<b;
}
int main() {
int H = 7;
int A = 8;
cout<<"The dimensions of the triangle are : \n";
cout<<"Hypotenuse = "<<H<<endl;
findDimensionsRightTriangle(H, A);
return 0;
}
출력 결과
The dimensions of the triangle are :
Hypotenuse = 7
Perpendicular = 2.43845
Base = 6.56155
코드 설명
먼저 빗변의 제곱이 넓이의 4배보다 작은지 검사하여 해가 존재하는지 확인합니다. 조건을 만족하지 않으면 "Not Possible"을 출력하고 함수를 종료합니다. 조건을 만족하면 √(H² + 4A)와 √(H² − 4A)를 각각 계산한 뒤, 앞서 유도한 공식에 따라 높이(p)와 밑변(b)을 구해 출력합니다.