[백준 6322] 직각 삼각형의 두 변 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
여러 개의 테스트 케이스가 주어지는 상황에서, 각 케이스마다 직각삼각형의 세 변 길이 a, b, c (c는 빗변) 중 하나가 -1로 주어질 때, 피타고라스 정리를 이용하여 누락된 변의 길이를 구하는 문제입니다.
세 변의 길이는 양의 정수이며, 누락된 변을 계산했을 때 삼각형이 성립하지 않으면 “Impossible.”을 출력합니다. 모든 입력 값이 0이 되면 종료합니다.
접근법
피타고라스 정리 a² + b² = c²를 사용하여 누락된 변을 계산합니다.
누락된 변이 빗변 c인 경우, c = √(a² + b²)로 계산합니다.
계산된 c가 삼각형의 변으로 유효하려면 삼각형 부등식을 만족해야 하므로 c < a + b를 확인합니다. 제곱근 안의 값이 음수거나 계산 결과가 NaN이면 불가능합니다.
빗변 c가 주어지고 a 또는 b가 누락된 경우, 변 = √(c² - 다른변²)로 계산합니다.
예를 들어 b가 누락되었다면 b = √(c² - a²)입니다. 계산된 변이 유효하려면 변 + 다른변 > c를 만족해야 합니다. c² - 다른변²이 음수거나 계산 결과가 NaN이면 불가능합니다.
각 테스트 케이스마다 “Triangle #번호”를 출력하고, 누락된 변을 “변 = 값” 형식으로 소수점 셋째 자리까지 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Globalization;
namespace Solution {
class Program {
static void Main(string[] args) {
Console.OutputEncoding = System.Text.Encoding.UTF8;
var tc = 1;
while (true) {
var parts = Console.ReadLine()!.Split();
var a = double.Parse(parts[0], CultureInfo.InvariantCulture);
var b = double.Parse(parts[1], CultureInfo.InvariantCulture);
var c = double.Parse(parts[2], CultureInfo.InvariantCulture);
if (a == 0 && b == 0 && c == 0) break;
Console.WriteLine($"Triangle #{tc}");
var ok = true;
var missing = ' ';
var ans = 0.0;
if (c == -1) {
missing = 'c';
ans = Math.Sqrt(a * a + b * b);
if (ans >= a + b || double.IsNaN(ans)) ok = false;
} else if (b == -1) {
missing = 'b';
ans = Math.Sqrt(c * c - a * a);
if (ans + a <= c || double.IsNaN(ans)) ok = false;
} else {
missing = 'a';
ans = Math.Sqrt(c * c - b * b);
if (ans + b <= c || double.IsNaN(ans)) ok = false;
}
if (ok) Console.WriteLine($"{missing} = {ans:F3}");
else Console.WriteLine("Impossible.");
Console.WriteLine();
tc++;
}
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.setf(ios::fixed);
cout.precision(3);
int tc = 1;
while (true) {
double a, b, c;
cin >> a >> b >> c;
if (a == 0 && b == 0 && c == 0) break;
cout << "Triangle #" << tc << "\n";
bool ok = true;
char miss;
double ans = 0;
if (c == -1) {
miss = 'c';
ans = sqrt(a * a + b * b);
if (ans >= a + b || isnan(ans)) ok = false;
} else if (b == -1) {
miss = 'b';
ans = sqrt(c * c - a * a);
if (ans + a <= c || isnan(ans)) ok = false;
} else {
miss = 'a';
ans = sqrt(c * c - b * b);
if (ans + b <= c || isnan(ans)) ok = false;
}
if (ok) cout << miss << " = " << ans << "\n";
else cout << "Impossible.\n";
cout << "\n";
tc++;
}
return 0;
}