문제
직각 삼각형의 세 변 a, b, c 중 하나가 -1로 주어질 때, 피타고라스 정리(a^2 + b^2 = c^2)를 이용해 미지의 변 길이를 구하라.
입력
여러 줄에 걸쳐 a, b, c가 주어진다. 하나만 -1이다. 0 0 0이면 종료한다.
출력
각 케이스마다 미지의 변 길이를 소수점 3자리까지 출력한다. 불가능하면 "Impossible."을 출력한다.
예제
| 입력 | 출력 |
|---|---|
3 4 -1 3 -1 4 0 0 0 | Triangle #1 c = 5.000 Triangle #2 b = 2.646 |
풀이
-1인 변을 판별하고 피타고라스 정리를 적용한다.
- 세 값 중 -1인 변을 찾는다
- c가 -1이면
sqrt(a^2 + b^2)로 계산한다 - a 또는 b가 -1이면
sqrt(c^2 - 다른변^2)으로 계산한다 - 제곱근 안의 값이 음수이면 "Impossible."을 출력한다
핵심 아이디어: 빗변(c)을 구할 때는 항상 가능하지만, 직각변(a, b)을 구할 때는 c^2 - 다른변^2이 음수일 수 있어 불가능 판정이 필요하다.
코드
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a, b, c, t = 0;
while (cin >> a >> b >> c && (a || b || c))
{
cout << "Triangle " << '#' << ++t << '\n';
float t;
char i;
if (a == -1)
{
i = 'a';
t = (c * c) - (b * b);
}
else if (b == -1)
{
i = 'b';
t = (c * c) - (a * a);
}
else
{
i = 'c';
t = (a * a) + (b * b);
}
t = sqrt(t);
cout << fixed;
cout.precision(3);
if (t > 0)
cout << i << " = " << t << '\n';
else
{
cout << "Impossible." << '\n';
}
cout << '\n';
}
}복잡도
- 시간: O(T) (T: 테스트 케이스 수)
- 공간: O(1)