치춘짱베리굿나이스
[백준] 1925 본문
삼각형
문제
평면상에 세 개의 점이 주어지면, 그 세 점으로 이루어지는 삼각형은 유일하게 결정된다. 또는, 삼각형이 이루어지지 않기도 한다. 세 점의 좌표가 주어졌을 때 다음에 따라 이 삼각형의 종류를 판단하는 프로그램을 작성하시오.
- 세 점이 일직선 위에 있으면 - ‘삼각형이 아님’ 출력할 때는 X
- 세 변의 길이가 같으면 - ‘정삼각형’ 출력할 때는 JungTriangle
- 두 변의 길이가 같으면
- 가장 큰 각이 90°보다 크면 - ‘둔각이등변삼각형’ 출력할 때는 Dunkak2Triangle
- 가장 큰 각이 90°이면 - ‘직각이등변삼각형’ 출력할 때는 Jikkak2Triangle
- 가장 큰 각이 90°보다 작으면 - ‘예각이등변삼각형’ 출력할 때는 Yeahkak2Triangle
- 세 변의 길이가 모두 다르면
- 가장 큰 각이 90°보다 크면 - ‘둔각삼각형’ 출혁할 때는 DunkakTriangle
- 가장 큰 각이 90°이면 - ‘직각삼각형’ 출력할 때는 JikkakTriangle
- 가장 큰 각이 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";
}
반성회
엄청나게 지저분한 문제였다
문제 자체는 어렵지 않은데 코드를 깔끔하게 짜고 싶다는 욕심이 든달까…
이등변삼각형 조건을 구할 때 가장 큰 변을 놔두고 나머지 두개끼리만 비교를 했다가 틀렸었음
- 변 3개 길이의 제곱 (
first
,second
,third
) 을 구한다 - 가장 긴 값 (
max
) 과 나머지 두 값 (min1
,min2
) 을 구한다 - 세 변 중에 두 개가 같은 값이 있으면
isSame
플래그를true
로 바꾼다 - 가장 긴 변의 길이 (
sqrt(max)
) 가 나머지 두 변의 길이의 합 (sqrt(min1) + sqrt(min2)
) 보다 길 경우 삼각형이 될 수 없으므로X
를 출력 - 세 변의 제곱의 길이가 같으면 세 변의 길이가 같으므로
JungTriangle
출력 - 나머지는 피타고라스 정리로 풀엇따
Comments