(백준 / 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)

