본문 바로가기

PS

[ 백준 / C++ ] 11758 : CCW

[ 문제 ]

 

 

11758번: CCW

첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다.

www.acmicpc.net

 

[ 접근방법 ]

 

벡터의 외적을 활용하였다. 

 

세 점 p[0], p[1], p[2]가 있을 때 두 벡터 p[0]p[1], p[1]p[2]의 외적을 계산한다.

 

두 벡터가 시계방향일 때와 반시계방향일 때 외적벡터의 방향도 정반대가 되기에

 

0과 비교하여 시계방향인지 반시계방향인지 일직선인지를 파악할 수 있다.

 

[ 소스코드 ]

 

#include <iostream>

using namespace std;

struct pos
{
    int x, y;
};

pos p[3];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    for(int i = 0; i < 3; i++)cin >> p[i].x >> p[i].y;

    // p0p1 = (p1x - p0x, p1y - p0y, 0), p1p2 = (p2x - p1x, p2y - p1y, 0)
    int cnt = (p[1].x - p[0].x) * (p[2].y - p[1].y) - (p[1].y - p[0].y) * (p[2].x - p[1].x);

    if(cnt > 0)cout << "1";
    else if(cnt < 0)cout << "-1";
    else cout << "0";

    return 0;
}