문제 개요
이 문제에서는 직각삼각형의 한 변을 나타내는 정수 a가 주어집니다. 우리가 해야 할 일은 변 a를 포함하는 직각삼각형이 성립할 수 있는지 확인하고, 성립한다면 나머지 두 변의 값을 구하는 것입니다.
예제로 문제 이해하기
입력
a = 5
출력
Sides : 5, 12, 13
설명
구해진 세 변은 피타고라스 정리를 만족합니다. 즉, 52 + 122 = 132 이 성립하므로 5, 12, 13은 유효한 직각삼각형의 세 변입니다.
풀이 접근 방법
이 문제의 가장 간단한 해결책은 피타고라스 정리(Pythagorean theorem)를 활용하는 것입니다. 직각삼각형의 세 변은 항상 다음 관계를 만족합니다.
a2 + b2 = c2
여기서 a와 b는 직각을 이루는 두 변이고, c는 빗변(hypotenuse)입니다. 이 공식을 응용하면 주어진 값 a만으로 나머지 두 변 b와 c를 계산할 수 있습니다. 계산식은 a가 홀수인지 짝수인지에 따라 달라집니다.
Case 1: a가 짝수인 경우
b = (a2 / 4) - 1 c = (a2 / 4) + 1
Case 2: a가 홀수인 경우
b = (a2 - 1) / 2 c = (a2 + 1) / 2
단, a = 1 또는 a = 2인 경우에는 위 공식으로도 조건을 만족하는 양의 정수 변을 가진 직각삼각형이 존재하지 않으므로, 이때는 -1을 출력하여 불가능함을 알려야 합니다.
구현 예제 코드
아래는 위 풀이 과정을 C++로 구현한 프로그램입니다.
예제
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
#define PI 3.1415926535
void printOtherSides(int n) {
int b, c;
if (n & 1) { // n이 홀수인 경우
if (n == 1)
cout << -1 << endl;
else {
b = (n*n - 1) / 2;
c = (n*n + 1) / 2;
}
} else { // n이 짝수인 경우
if (n == 2)
cout << -1 << endl;
else {
b = n*n/4 - 1;
c = n*n/4 + 1;
}
}
cout << "Sides : a = " << n << ", b = " << b << ", c = " << c << endl;
}
int main() {
int a = 5;
printOtherSides(a);
return 0;
}출력 결과
Sides : a = 5, b = 12, c = 13
마무리
이처럼 피타고라스 정리를 변형한 공식을 활용하면, 하나의 변만 주어져도 복잡한 반복문 없이 O(1)의 시간 복잡도로 직각삼각형의 나머지 두 변을 바로 계산할 수 있습니다. 다만 a가 1 또는 2인 특수한 경우에는 정수 변으로 직각삼각형을 만들 수 없다는 점을 반드시 예외 처리해 주어야 합니다.