[백준 5617] Problem 1 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
세 변이 주어질 때 삼각형이 가능한지 확인하고, 가능하다면 예각/직각/둔각 삼각형으로 분류해 개수를 세는 문제입니다.
접근법
먼저 세 변을 정렬해 가장 긴 변을 기준으로 판단합니다.
다음으로 두 짧은 변의 합이 가장 긴 변 이하이면 삼각형이 아니므로 지금까지의 개수를 출력하고 종료합니다.
이후 삼각형이라면 가장 긴 변의 제곱과 나머지 두 변의 제곱 합을 비교해 직각/예각/둔각을 판정합니다.
마지막으로 이를 반복하다가 종료 조건에서 개수를 출력합니다.
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
using System;
class Program {
static void Main() {
var parts = Console.In.ReadToEnd().Split();
var idx = 0;
var total = 0;
var right = 0;
var acute = 0;
var obtuse = 0;
while (idx + 2 < parts.Length) {
var a = int.Parse(parts[idx++]);
var b = int.Parse(parts[idx++]);
var c = int.Parse(parts[idx++]);
var x = a; var y = b; var z = c;
if (x > y) { var t = x; x = y; y = t; }
if (y > z) { var t = y; y = z; z = t; }
if (x > y) { var t = x; x = y; y = t; }
if (x + y <= z) {
Console.WriteLine($"{total} {right} {acute} {obtuse}");
return;
}
total++;
var s = x * x + y * y;
var l = z * z;
if (s == l) right++;
else if (s > l) acute++;
else obtuse++;
}
}
}
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
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int total = 0, right = 0, acute = 0, obtuse = 0;
int a, b, c;
while (cin >> a >> b >> c) {
int x = a, y = b, z = c;
if (x > y) swap(x, y);
if (y > z) swap(y, z);
if (x > y) swap(x, y);
if (x + y <= z) {
cout << total << " " << right << " " << acute << " " << obtuse << "\n";
return 0;
}
total++;
int s = x * x + y * y;
int l = z * z;
if (s == l) right++;
else if (s > l) acute++;
else obtuse++;
}
return 0;
}