작성일 :

문제 링크

5617번 - Problem 1

설명

세 변이 주어질 때 삼각형이 가능한지 확인하고, 가능하다면 예각/직각/둔각 삼각형으로 분류해 개수를 세는 문제입니다.


접근법

먼저 세 변을 정렬해 가장 긴 변을 기준으로 판단합니다.

다음으로 두 짧은 변의 합이 가장 긴 변 이하이면 삼각형이 아니므로 지금까지의 개수를 출력하고 종료합니다.

이후 삼각형이라면 가장 긴 변의 제곱과 나머지 두 변의 제곱 합을 비교해 직각/예각/둔각을 판정합니다.

마지막으로 이를 반복하다가 종료 조건에서 개수를 출력합니다.



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;
}