본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ)코딩 11758번 : CCW 답

반응형

www.acmicpc.net/problem/11758

 

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

 

대표적인 기하 알고리즘 중 하나인 CCW입니다.

CCW : p1,p2,p3 점에서 볼 때 선분p1p2, 선분p2p3의 외적을 이용합니다.

 

외적의 정의 : AXB = a*b*sina로 정의 되는데 이뜻은 vector A를 기준으로 vector B가 

 얼마나 회전하려는 성질을 가지고 있는지를 표시하는 척도라고 볼 수 있습니다.

 따라서 외적의 값이 

1.양수일 때 : sin값이 양수이므로 선분의 위치가 시계방향으로 놓여져 있으며

2.0일 때 : sin값이 0이므로 일직선

3.음수일 때 : sin값이 음수이므로 반시계방향이라고 생각할 수 있습니다.

 

#include <iostream>
using namespace std;
int main() {
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    if ((x1*y2 - x2*y1 + x2*y3 - x3*y2 + x3*y1 - x1*y3) / 2 > 0)
        cout << '1' << '\n';
    else if ((x1*y2 - x2*y1 + x2*y3 - x3*y2 + x3*y1 - x1*y3) / 2 < 0)
        cout << "-1" << '\n';
    else
        cout << '0' << '\n';
}​