June

CCW(Counter ClockWise)

CCW 알고리즘

CCW 알고리즘은 Counter ClockWise의 약자로, 세 점의 방향성을 판단하는데 사용된다. 세 점

가 주어졌을 때 이 점들이 시계 방향인지, 반시계 방향인지, 아니면 일직선 상에 있는지를 판별한다.

수학적 원리

세 점의 방향은 벡터의 외적을 이용해서 구할 수 있다.

  • 벡터 AB = (x₂-x₁, y₂-y₁)
  • 벡터 AC = (x₃-x₁, y₃-y₁)
  • 외적값

    CCW = (x₂-x₁) * (y₃-y₁) - (y₂-y₁) * (x₃-x₁)

    → 위 식은 사실 AB와 AC가 만드는 평행사변형의 부호있는 면적 * 2이다.

결과 해석

  • CCW > 0 → 반시계 방향
  • CCW < 0 → 시계 방향
  • CCW = 0 → 세 점이 일직선 상에 있음
c++
#include <iostream>
using namespace std;

struct Point {
    long long x, y;
};

int ccw(Point a, Point b, Point c) {
    long long result = (b.x - a.x) * (c.y - a.y) - 
                       (b.y - a.y) * (c.x - a.x);

    if (result > 0) return 1;   // 반시계 방향
    if (result < 0) return -1;  // 시계 방향
    return 0;                   // 일직선
}

int main() {
    Point a, b, c;
    cin >> a.x >> a.y;
    cin >> b.x >> b.y;
    cin >> c.x >> c.y;

    int res = ccw(a, b, c);
    cout << res << "\n"; // 1, -1, 0 출력
}

활용 예시

백준에서는 주로 선분 교차 여부를 판단하는 과정에 사용한다. 또한 다각형의 넓이를 계산하는 과정에도 사용된다.

Seoul, South Korea

jwsong5160@gmail.com

© 2026 Junwoo Song