본문 바로가기

알고리즘/백준

백준1925-삼각형(브론즈1)

반응형

문제출처 : https://www.acmicpc.net/problem/1925

 

1925번: 삼각형

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

www.acmicpc.net

문제풀이)

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;
}

 

반응형