작성일 :

문제 링크

11596번 - Triangle

설명

주어진 두 삼각형의 변 길이로 직사각형을 한 번 잘라 만들 수 있는지 판단하는 문제입니다.


접근법

먼저 두 삼각형의 세 변을 각각 정렬해 가장 긴 변이 빗변이 되도록 맞춥니다.

다음으로 피타고라스 정리로 두 삼각형이 직각삼각형인지 확인합니다.

이후 두 삼각형의 세 변이 모두 같으면 같은 직각삼각형이므로 직사각형의 대각선으로 잘라 만들 수 있습니다.

마지막으로 조건을 만족하면 YES, 아니면 NO를 출력합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;

class Program {
  static void Main() {
    var parts = Console.In.ReadToEnd().Split();
    var a = new int[3];
    var b = new int[3];
    for (var i = 0; i < 3; i++) a[i] = int.Parse(parts[i]);
    for (var i = 0; i < 3; i++) b[i] = int.Parse(parts[i + 3]);

    Array.Sort(a);
    Array.Sort(b);

    var rightA = a[0] * a[0] + a[1] * a[1] == a[2] * a[2];
    var rightB = b[0] * b[0] + b[1] * b[1] == b[2] * b[2];
    var same = a[0] == b[0] && a[1] == b[1] && a[2] == b[2];

    Console.WriteLine(rightA && rightB && same ? "YES" : "NO");
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int a[3], b[3];
  for (int i = 0; i < 3; i++) cin >> a[i];
  for (int i = 0; i < 3; i++) cin >> b[i];

  sort(a, a + 3);
  sort(b, b + 3);

  bool rightA = a[0] * a[0] + a[1] * a[1] == a[2] * a[2];
  bool rightB = b[0] * b[0] + b[1] * b[1] == b[2] * b[2];
  bool same = a[0] == b[0] && a[1] == b[1] && a[2] == b[2];

  cout << (rightA && rightB && same ? "YES" : "NO") << "\n";
  return 0;
}