Programming
Study/Programming / / 2024. 3. 20. 12:01

BOJ 11758번 : CCW / C언어

728x90
 

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`는 Counter Clockwise(반시계 방향)의 약자로, 세 점의 좌표를 이용하여 계산한 외적 값임. 
 
1. `x1 * y2 + x2 * y3 + x3 * y1`은 세 점의 외적 값
2. `- y1 * x2 - y2 * x3 - y3 * x1`은 위에서 계산한 값을 빼주는 역할
3. `ccw` 값이 양수이면 세 점은 반시계 방향으로 배열되어 있고, 음수이면 시계 방향으로 배열되어 있으며, 0이면 일직선상에 위치해 있음을 의미.
 
코드:
더보기

#include <stdio.h>

int main() {
    // 3개 점의 좌표를 입력.
    int x1, x2, y1, y2, x3, y3;
    scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3);
    
    // 교차 곱을 계산.
    int ccw = x1 * y2 + x2 * y3 + x3 * y1;
    ccw = ccw - y1 * x2 - y2 * x3 - y3 * x1;
    
    // ccw가 양수면 반시계 방향, 음수면 시계 방향, 0이면 일직선 상
    if (ccw > 0)
        printf("1"); // 반시계 방향
    else if (ccw < 0)
        printf("-1"); // 시계 방향
    else
        printf("0"); // 일직선 상
    return 0;
}

728x90
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유