백준 11758번 문제 바로가기

세 점이 순서대로 주어지고 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;
}

References