파이썬 문제풀이
[백준 파이썬] 17386 선분 교차 1
냄비짱
2024. 1. 9. 00:56
728x90
📌문제 출처
백준 단계별 문제풀이 : 기하2
https://www.acmicpc.net/problem/17386
17386번: 선분 교차 1
첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.
www.acmicpc.net
❓ 문제
📗 풀이 코드
'''
벡터 외적을 활용한 CCW 알고리즘을 활용하여 구할 수 있다.
하나의 기준 선분과 기준 선분의 한 점과 다른 선분의 각 끝 점이 이루는 두개의 벡터 쌍의 외적을 각각 구한다.
이 두 외적 벡터가 각각 다른 방향이라면 교차를 하게된다.(두 외적 벡터의 곱이 음수)
그러나 교차하지는 않으나 이루는 각의 방향이 다른 경우가 있다.
이런 경우라면 기준 선분에 따라 한 번은 교차를, 한 번은 교차하지 않는 결과가 나온다.
따라서 기준 선분을 다른 선분으로 바꾼 상황에서 모두 교차하는지 확인해야한다.
'''
input = open(0).readline
def solution():
xs,ys = [], [] # 모든 점의 x좌표와 y좌표
for _ in range(2):
x1,y1,x2,y2 = map(int, input().split())
xs += [x1,x2]
ys += [y1,y2]
def ccw(xs,ys): # 세 점의 x좌표와 y좌표
res = 0
for i in range(3):
res += xs[i]*ys[(i+1)%3] - xs[(i+1)%3]*ys[i]
return res
# 기준 선분을 바꿔가며 교차 확인
res1 = ccw(xs[:2]+[xs[2]],ys[:2]+[ys[2]])*ccw(xs[:2]+[xs[3]],ys[:2]+[ys[3]])
res2 = ccw(xs[2:4]+[xs[0]],ys[2:4]+[ys[0]])*ccw(xs[2:4]+[xs[1]],ys[2:4]+[ys[1]])
print(1 if res1<0 and res2<0 else 0)
if __name__ == '__main__':
solution()