PS

[백준/Python,C] (G3) 선분 교차 1 - 17386

MSHUN 2023. 11. 7.
반응형

Baekjoon Online Judge의 17386 선분 교차 1 문제의 Python,C풀이입니다.

 

17386번: 선분 교차 1

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.

www.acmicpc.net

💻코드

def ccw(ax, ay, bx, by, cx, cy):
    return (ax*by + bx*cy + cx*ay) - (bx*ay + cx*by + ax*cy)


x1, y1, x2, y2 = map(int, input().split())
x3, y3, x4, y4 = map(int, input().split())

ccw123 = ccw(x1, y1, x2, y2, x3, y3)
ccw124 = ccw(x1, y1, x2, y2, x4, y4)
ccw341 = ccw(x3, y3, x4, y4, x1, y1)
ccw342 = ccw(x3, y3, x4, y4, x2, y2)

# 두 선분이 한 직선 위에 있는 경우
if ccw123 * ccw124 == 0 and ccw341 * ccw342 == 0:
    # 두 선분의 x좌표가 겹치는지 확인하여 겹치면 1, 아니면 0을 출력
    print(1 if min(x1, x2) <= max(x3, x4) and min(x3, x4) <= max(x1, x2) else 0)
else:
    # 두 선분이 서로 교차하는지 확인하여 교차하면 1, 아니면 0을 출력
    print(1 if ccw123 * ccw124 <= 0 and ccw341 * ccw342 <= 0 else 0)
#include <stdio.h>

long long ccw(int ax, int ay, int bx, int by, int cx, int cy) {
    long long result = (long long)ax * by + (long long)bx * cy + (long long)cx * ay - (long long)bx * ay - (long long)cx * by - (long long)ax * cy;
    if(result>0){
        return 1;
    }
    else{
        if(result<0){
            return -1;
        }
        else{
            return 0;
        }
    }
}

int main() {
    int x1, y1, x2, y2;
    int x3, y3, x4, y4;
    long long ccw123, ccw124, ccw341, ccw342;

    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    scanf("%d %d %d %d", &x3, &y3, &x4, &y4);

    ccw123 = ccw(x1, y1, x2, y2, x3, y3);
    ccw124 = ccw(x1, y1, x2, y2, x4, y4);
    ccw341 = ccw(x3, y3, x4, y4, x1, y1);
    ccw342 = ccw(x3, y3, x4, y4, x2, y2);

    // 두 선분이 한 직선 위에 있는 경우
    if (ccw123 * ccw124 == 0 && ccw341 * ccw342 == 0) {
        // 두 선분의 x좌표가 겹치는지 확인하여 겹치면 1, 아니면 0을 출력
        if (x1 > x2) { int temp = x1; x1 = x2; x2 = temp; }
        if (x3 > x4) { int temp = x3; x3 = x4; x4 = temp; }
        printf("%d\n", (x1 <= x4 && x3 <= x2) ? 1 : 0);
    } else {
        // 두 선분이 서로 교차하는지 확인하여 교차하면 1, 아니면 0을 출력
        printf("%d\n", (ccw123 * ccw124 <= 0 && ccw341 * ccw342 <= 0) ? 1 : 0);
    }

    return 0;
}

🧠풀이

CCW를 사용하여 풀었다.

자세한 설명은 검색해서 찾아보도록 하자.

 

위 코드들은 두 선분이 한 직선 위에 있는 경우일때 문제가 있다. 수정하긴 귀찮으므로 수정하진 않겠다.

사실 문제 조건을 보면 알겠지만 세 점이 일직선에 있는 경우 따윈 없다. 그러므로 문제 없이 정답처리가 된듯 하다.

🤔느낀 점

C 자료형에 익숙하지 않다보니 조금 헤맸다.

Baekjoon Online Judge

반응형

댓글