[백준 / BOJ][Python]

(백준 / BOJ)(Python) 17387 – 세그먼트 교차점 2

https://www.acmicpc.net/problem/17387

17387호: 세그먼트 교차 2

첫 번째 행은 L1의 양쪽 끝에서 x1, y1, x2 및 y2를 제공하고 두 번째 행은 L2의 양쪽 끝에서 x3, y3, x4 및 y4를 제공합니다.

www.acmicpc.net

문제를 해결하다

문제 ‘17386 – 세그먼트 교차점 1′(https://dodobow.27)에 조건이 있는 문제가 추가되었습니다. 3개 또는 4개의 점이 모두 직선에 있는 경우가 있으므로 이러한 경우에 대한 예외 처리를 추가할 수 있습니다.

암호

import sys
input = sys.stdin.readline

def ccw(p1, p2, p3): #CCW
    x1, y1 = p1
    x2, y2 = p2
    x3, y3 = p3
    return (x1 * y2 + x2 * y3 + x3 * y1) - (x2 * y1 + x3 * y2 + x1 * y3)

x1, y1, x2, y2 = map(int, input().split()) #선분 A
x3, y3, x4, y4 = map(int, input().split()) #선분 B
p1, p2, p3, p4 = (x1, y1), (x2, y2), (x3, y3), (x4, y4)
cross1 = ccw(p1, p2, p3) * ccw(p1, p2, p4) #선분 A에서 B에 대한 CCW 값
cross2 = ccw(p3, p4, p1) * ccw(p3, p4, p2) #선분 B에서 A에 대한 CCW 값
ans = 0 #기본값 (교차하지 않음)
if cross1 == cross2 == 0: #모두 0이라면 (한 직선 위에 있으면)
    if min(x1, x2) <= max(x3, x4) and min(x3, x4) <= max(x1, x2) and min(y1, y2) <= max(y3, y4) and min(y3, y4) <= max(y1, y2): #두 직선이 겹치면 (점끼리 만나는 것도 포함)
        ans = 1 #교차
elif cross1 <= 0 and cross2 <= 0: #모두 음수라면
    ans = 1 #교차
print(ans)