반응형
문제출처 : https://www.acmicpc.net/problem/1925
문제풀이)
1. 같은 선에 있는지 없는지는 세 점의 기울기를 체크해서 처리
2. 직각/예각/둔각 은 두 벡터의 내적이 0 이면 직각 음수이면 둔각 양수이면 예각을 이용해 처리
(https://mrw0119.tistory.com/12) 참고
#include <iostream>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926535
using namespace std;
struct point{
int x,y;
};
bool checkLine(point a,point b,point c)
{
///a와 b의 기울기와 a와 c의 기울기가 같으면 같은 라인이다.
int dxAB = b.x - a.x;
int dyAB = b.y - a.y;
int dxAC = c.x - a.x;
int dyAC = c.y - a.y;
/*
dyAB / dxAB == dyAC /dxAC 이지만 dxAB 가 0 인 경우도 나올 수 있다.
따라서 dyAB * dxAC == dyAC * dxAB 형식으로 체크
*/
if(dxAB *dyAC == dyAB *dxAC) return true;
return false;
}
bool checkJungTriangle(point a,point b,point c)
{
/// 세변이 길이가 같은지 체크
///직각 삼각형의 변의 길이는 sqrt(a^2 + b^2) 이지만 굳이 sqrt 를 할 필요 없다.
int ab = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
int ac = (a.x - c.x) * (a.x - c.x) + (a.y - c.y) * (a.y - c.y);
int bc = (b.x - c.x) * (b.x - c.x) + (b.y - c.y) * (b.y - c.y);
if(ab==ac && ab == bc) return true;
return false;
}
bool checkTwoLenght(point a,point b,point c)
{
/// 두변이 길이가 같은지 체크
///직각 삼각형의 변의 길이는 sqrt(a^2 + b^2) 이지만 굳이 sqrt 를 할 필요 없다.
int ab = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
int ac = (a.x - c.x) * (a.x - c.x) + (a.y - c.y) * (a.y - c.y);
int bc = (b.x - c.x) * (b.x - c.x) + (b.y - c.y) * (b.y - c.y);
if(ab==ac || ab == bc || ac == bc) return true;
return false;
}
int dot(int x1,int y1,int x2,int y2)
{
/*
A,B 벡터 내적은 A.x * B.x + A.y * B.y
90도 일때 0
내각일때 0보다 큰 수
둔각일때 음수
*/
return x1 *x2 + y1 * y2;
}
int main()
{
point a,b,c;
cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
if(checkLine(a,b,c)) cout << "X" << endl;
else if(checkJungTriangle(a,b,c)) cout << "JungTriangle" << endl;
else if(checkTwoLenght(a,b,c))
{
if(dot(b.x-a.x,b.y-a.y,c.x-a.x,c.y-c.y)<0) cout << "Dunkak2Triangle" << endl;
else if(dot(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y)<0) cout << "Dunkak2Triangle" << endl;
else if(dot(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y)<0) cout << "Dunkak2Triangle" << endl;
else if(dot(b.x-a.x,b.y-a.y,c.x-a.x,c.y-c.y)==0) cout << "Jikkak2Triangle" << endl;
else if(dot(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y)==0) cout << "Jikkak2Triangle" << endl;
else if(dot(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y)==0) cout << "Jikkak2Triangle" << endl;
else cout << "Yeahkak2Triangle" << endl;
}
else
{
if(dot(b.x-a.x,b.y-a.y,c.x-a.x,c.y-c.y)<0) cout << "DunkakTriangle" << endl;
else if(dot(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y)<0) cout << "DunkakTriangle" << endl;
else if(dot(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y)<0) cout << "DunkakTriangle" << endl;
else if(dot(b.x-a.x,b.y-a.y,c.x-a.x,c.y-c.y)==0) cout << "JikkakTriangle" << endl;
else if(dot(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y)==0) cout << "JikkakTriangle" << endl;
else if(dot(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y)==0) cout << "JikkakTriangle" << endl;
else cout << "YeahkakTriangle" << endl;
}
return 0;
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 16195] 1,2,3 더하기 9 (0) | 2020.09.26 |
---|---|
백준1977-완전제곱수(브론즈1) (0) | 2020.09.24 |
백준1924-2007년(브론즈1) (0) | 2020.09.22 |
백준1855-암호(브론즈1) (0) | 2020.09.21 |
백준1834-나머지와 몫이 같은 수(브론즈1) (0) | 2020.09.20 |