세 점이 순서대로 주어지고 CCW(Counter-ClockWise; 반시계방향)인지 CW(ClockWise; 시계방향)인지 알아내느 문제. 보자마자 두 개의 벡터로 표현하면 편하겠다고 생각했다. 예전에 비슷한 문제를 풀어본 기억이 있기에 바로 외적
을 떠올렸다. (기울기로 풀다가 엄청 고생했던 기억이…허허)
내 풀이
처음으로 struct
기능을 사용해보았다. 좌표(coordinate; cdn)에 x,y 좌표가 있으므로 struct cdn { int x,y; };
처럼 작성하면 dot operator(.)로 접근할 수 있다. 함수 안에서는 int나 char 변수를 선언하듯이 cdn
을 선언하고 사용하면 된다. 좌표나 특정 의미가 있는 값이 들어올 때 struct을 이용하면 코드가 간결해진다.
외적의 정의에 따라서 행렬식을 계산한 뒤에 나온 값에 따라 반시계방향, 시계방향을 결정해주면 된다. (간만에 오른손법칙으로 돌리고 돌리고 또 돌려보았다 ㅋㅎㅋㅎ)
#include <iostream>
using namespace std;
struct cdn {
int x,y;
};
int main()
{
cdn a, b, c;
cin >> a.x >> a.y;
cin >> b.x >> b.y;
cin >> c.x >> c.y;
// 외적
int crossProduct;
crossProduct = (a.x-b.x)*(c.y-b.y) - (c.x-b.x)*(a.y-b.y);
if (crossProduct > 0){
cout << -1;
} else if (crossProduct == 0){
cout << 0;
} else{
cout << 1;
}
return 0;
}