치춘짱베리굿나이스

[백준] 1925 본문

C C++/알고리즘풀이

[백준] 1925

치춘 2023. 7. 15. 16:12

삼각형

문제

평면상에 세 개의 점이 주어지면, 그 세 점으로 이루어지는 삼각형은 유일하게 결정된다. 또는, 삼각형이 이루어지지 않기도 한다. 세 점의 좌표가 주어졌을 때 다음에 따라 이 삼각형의 종류를 판단하는 프로그램을 작성하시오.

  1. 세 점이 일직선 위에 있으면 - ‘삼각형이 아님’ 출력할 때는 X
  2. 세 변의 길이가 같으면 - ‘정삼각형’ 출력할 때는 JungTriangle
  3. 두 변의 길이가 같으면
    1. 가장 큰 각이 90°보다 크면 - ‘둔각이등변삼각형’ 출력할 때는 Dunkak2Triangle
    2. 가장 큰 각이 90°이면 - ‘직각이등변삼각형’ 출력할 때는 Jikkak2Triangle
    3. 가장 큰 각이 90°보다 작으면 - ‘예각이등변삼각형’ 출력할 때는 Yeahkak2Triangle
  4. 세 변의 길이가 모두 다르면
    1. 가장 큰 각이 90°보다 크면 - ‘둔각삼각형’ 출혁할 때는 DunkakTriangle
    2. 가장 큰 각이 90°이면 - ‘직각삼각형’ 출력할 때는 JikkakTriangle
    3. 가장 큰 각이 90°보다 작으면 - ‘예각삼각형’ 출력할 때는 YeahkakTriangle

입력

첫째 줄부터 셋째 줄까지 삼각형을 이루는 점의 x좌표와 y좌표가 빈칸을 사이에 두고 주어진다. 입력되는 수는 절댓값이 10,000을 넘지 않는 정수이다. 입력으로 주어지는 세 좌표는 중복되지 않는다.

출력

위의 경우에 따라 삼각형의 종류가 무엇인지 출력한다.

풀이

#include <iostream>
#include <cmath>
#include <algorithm>

int main(void) {
    std::pair<int, int> p[3];
    double first, second, third, max, min1, min2;
    bool isSame = false;

    for (int i = 0; i < 3; i++)
        std::cin >> p[i].first >> p[i].second;

    first = std::pow(p[0].first - p[1].first, 2) + std::pow(p[0].second - p[1].second, 2);
    second = std::pow(p[1].first - p[2].first, 2) + std::pow(p[1].second - p[2].second, 2);
    third = std::pow(p[0].first - p[2].first, 2) + std::pow(p[0].second - p[2].second, 2);
    max = std::max(std::max(first, second), third);

    if (max == first) { min1 = second, min2 = third; }
    else if (max == second) { min1 = third, min2 = first; }
    else { min1 = first, min2 = second; }
    if (min1 == min2 || min2 == max || max == min1) isSame = true;

    if (std::sqrt(max) >= std::sqrt(min1) + std::sqrt(min2)) {std::cout << "X\n"; return 0;}
    if (min1 == min2 && min2 == max) std::cout << "JungTriangle";
    else if (min1 + min2 == max) std::cout << "Jikkak" << (isSame ? "2" : "") << "Triangle";
    else if (min1 + min2 < max) std::cout << "Dunkak" << (isSame ? "2" : "") << "Triangle";
    else std::cout << "Yeahkak" << (isSame ? "2" : "") << "Triangle";
}

반성회

엄청나게 지저분한 문제였다

문제 자체는 어렵지 않은데 코드를 깔끔하게 짜고 싶다는 욕심이 든달까…

이등변삼각형 조건을 구할 때 가장 큰 변을 놔두고 나머지 두개끼리만 비교를 했다가 틀렸었음

  1. 변 3개 길이의 제곱 (first, second, third) 을 구한다
  2. 가장 긴 값 (max) 과 나머지 두 값 (min1, min2) 을 구한다
  3. 세 변 중에 두 개가 같은 값이 있으면 isSame 플래그를 true로 바꾼다
  4. 가장 긴 변의 길이 (sqrt(max)) 가 나머지 두 변의 길이의 합 (sqrt(min1) + sqrt(min2)) 보다 길 경우 삼각형이 될 수 없으므로 X를 출력
  5. 세 변의 제곱의 길이가 같으면 세 변의 길이가 같으므로 JungTriangle 출력
  6. 나머지는 피타고라스 정리로 풀엇따

'C C++ > 알고리즘풀이' 카테고리의 다른 글

[백준] 13241  (0) 2023.08.08
[백준] 2161  (0) 2023.07.25
[백준] 2628  (2) 2023.07.14
[백준] 9661  (0) 2023.07.13
[백준] 9660  (0) 2023.07.13
Comments