fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 4771 (C++) 아름다운 삼각형
최초 업로드: 2025-10-06 14:08:35
최근 수정 시간: 2025-10-06 14:08:35
게시자: rlatjwls3333
카테고리: 백준
조회수: 4
# [Silver II] 아름다운 삼각형 [문제 링크](https://www.acmicpc.net/problem/4771) ## 문제 설명 <p> 한삼덕은 삼각형을 아름답게 그리는 세계적인 미술가이다. 이 미술가가 그린 삼각형은 보는 이의 마음을 빼앗아 버리며, 걸어가는 사람들의 걸음마저 멈추게 한다. 사람들은 그가 그린 삼각형은 예각, 직각, 둔각도 아니고, 정삼각형, 이등변삼각형도 아니라고 생각했다. 그 오묘한 변의 길이와 알 수 없는 각도, 보는 이의 마음을 편안하게 하는 넓이까지 사람들은 삼각형의 매력에 푹 빠져 있었다.</p> <p> 희원이는 삼덕이의 삼각형을 보고 아름답지 않다고 생각하는 사람이다. 희원이는 삼덕이가 그린 삼각형도 특별한 삼각형이 아니라는 것을 보여주려고 한다.</p> <p> 희원이는 삼덕이의 삼각형을 다음과 같이 분류하려고 한다.</p> <p> 삼각형을 변의 길이로 분류하면 3가지가 있다.</p> <p> <strong>Scalene</strong>: 모든 변의 길이가 같지 않음</p> <p> <strong>Isosceles</strong>: 두 변의 길이가 같음</p> <p> <strong>Equilateral</strong>: 세 변의 길이가 같음</p> <p> 또, 각을 기준으로 분류해도 3가지가 있다.</p> <p> <strong>Acute</strong>: 모든 각이 90도보다 작음</p> <p> <strong>Right</strong>: 한 각의 크기가 90도</p> <p> <strong>Obtuse</strong>: 한 각의 크기가 90도보다 큼</p> <p> 삼덕이가 그린 삼각형이 주어졌을 때, 이 삼각형이 어떤 삼각형인지 출력하는 프로그램을 작성하시오.</p> ## 입력 <p> 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 삼덕이가 그린 삼각형의 꼭짓점 좌표이고, 소수점 셋째 자리까지 주어진다. 꼭짓점 좌표는 x1, y1, x2, y2, x3, y3 순서이다. 입력의 마지막 줄에는 -1이 하나 있다.</p> <p> 한 각의 각도가 88-92범위에 있는 직각 삼각형이 아닌 삼각형, 두 변의 길이의 차이가 0.01 이내인 삼각형은 입력으로 주어지지 않는다.</p> ## 출력 <p> 입력으로 주어진 삼각형을 변의 길이로 분류한 결과와 각의 크기로 분류한 결과를 공백으로 구분하여 출력한다. 만약, 삼각형이 아닌 경우에는 Not a Triangle을 출력한다.</p> ## 풀이 일반 삼각형 판별 문제와 똑같은데 실수 오차를 처리해야 하는 부분이 껴있습니다. 실수 오차 범위를 ±0.1로 두고 구현했습니다. ``` c++ #include<bits/stdc++.h> using namespace std; typedef long double ld; pair<ld, ld> pos[3]; ld getDistSquare(int idx) { return (pos[idx].first-pos[(idx+1)%3].first)*(pos[idx].first-pos[(idx+1)%3].first) + (pos[idx].second-pos[(idx+1)%3].second)*(pos[idx].second-pos[(idx+1)%3].second); } int main() { ios::sync_with_stdio(0); cin.tie(0); while(true) { for(int i=0;i<3;i++) cin >> pos[i].first >> pos[i].second; if(cin.fail()) break; vector<ld> distSquare; for(int i=0;i<3;i++) distSquare.push_back(getDistSquare(i)); sort(distSquare.begin(), distSquare.end()); if(sqrtl(distSquare[2])-(sqrtl(distSquare[0])+sqrtl(distSquare[1]))>=-0.1) { cout << "Not a Triangle\n"; } else { if(abs(sqrtl(distSquare[0])-sqrtl(distSquare[2]))<=0.1) cout << "Equilateral "; else if(abs(sqrtl(distSquare[0])-sqrtl(distSquare[1]))<=0.1 || abs(sqrtl(distSquare[1])-sqrtl(distSquare[2]))<=0.1) cout << "Isosceles "; else cout << "Scalene "; if(distSquare[2]-(distSquare[0]+distSquare[1])>0.1) cout << "Obtuse\n"; else if(distSquare[2]-(distSquare[0]+distSquare[1])<-0.1) cout << "Acute\n"; else cout << "Right\n"; } } } ```