https://www.acmicpc.net/problem/11758
- 솔직히 몰라서 진짜 하드코딩했는데, 그래도 틀리길래 그냥 외적 상기할 겸 검색했습니다. 그랬더니 Counter Clock Wise라는 알고리즘이 있더군요.
CCW는 직역하면 시계 반대 방향을 의미합니다. Clock Wise가 시계 방향을 뜻하니 시계 방향 및 반시계 방향에 대한 문제라고 유추할 수 있습니다.
행렬을 배웠다는 가정 하에 풀이할 수 있다고 생각합니다. 만약 행렬을 배운 적이 없다면 한 번 인터넷에서 찾아보는 걸 추천합니다.(기하 및 선형대수학 등 다양한 분야에서 많이 사용합니다.)
- 세 점을 사용하여 두 벡터를 만들어줍니다.
(x1을 시점으로 해야 하므로 x1,x2와 x1,x3을 연산하면 됩니다.- 이렇게 만들어진 두 벡터를 행렬화하여 외적한 값을 계산합니다.
- 각 벡터의 내적값을 (V1x, V1y), (V2x,V2y)라 하면,
det(A) = (V1x V2y) - (V2x V1y)가 되고, 해당 값을 기반으로 이후의 연산(판별)을 진행하면 됩니다.
#include<iostream>
using namespace std;
int X1, X2, X3, Y1, Y2, Y3;
void input() {
cin >> X1 >> Y1 >> X2 >> Y2 >> X3 >> Y3;
}
int countClockWise() {
int num = X1 * Y2 + X2 * Y3 + X3 * Y1;
num -= Y1 * X2 + Y2 * X3 + Y3 * X1;
if (num > 0) return 1;
else if (num < 0) return -1;
else return 0;
}
void solution() {
input();
cout << countClockWise();
}
int main() {
cin.tie(0), cout.tie(0);
ios_base::sync_with_stdio(0);
solution();
return 0;
}