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

두 선분의 교차 판정(1), python
선분 교차 판정이란점 A, 점 B를 양 끝으로 하는 선분 AB와 점 C, 점 D를 양 끝으로 하는 선분 CD가 최소 1개 이상의 공통점을 가지는 경우를 두 선분이 교차한다고 말한다. 첫번째 그림과 같이 한점
aiden0413.tistory.com
두 선분의 교차 여부와, 교점이 1개일때 그 교점의 좌표를 구하는 문제이다.
매개변수 방정식을 이용해 연립방정식의 해를 구한다.
만약 해가 존재할시 구한 매개변수를 대입하여 좌표를 구할수 있다.
해가 존재하지 않을시에는 두 선분이 평행한지, 한 직선위에 있는지 체크해서 평행하다면 교점이 없는것이고, 한 직선위에 있다면 두 선분의 양 끝점의 좌표를 비교해서 교차되는지 확인한다.
두 선분이 한 직선위에 있는 경우, 두 선분의 끝에서 교점이 생기게 되면 교점이 1개이므로 예외쳐리를 해주었다.
x1,y1,x2,y2 = map(int, input().split())
x3,y3,x4,y4 = map(int, input().split())
a = x2-x1; b = -(x4-x3); e = x3-x1
c = y2-y1; d = -(y4-y3); f = y3-y1
p1 = (x1,y1);p2 = (x2,y2);p3 = (x3,y3);p4 = (x4,y4);
# 매개변수 방정식을 이용한 선분교차 체크
def solve(a,b,c,d,e,f):
if a*d-b*c == 0:
# 두 선분이 한 직선위에 있는 경우
if d*e-b*f == 0:
# 두 선분의 끝에서 교점이 생기는 경우
if max(min(p1,p2),min(p3,p4))==min(max(p1,p2),max(p3,p4)):
print(1)
print(*max(min(p1,p2),min(p3,p4)))
elif max(min(p1,p2),min(p3,p4))<min(max(p1,p2),max(p3,p4)):
print(1)
else:
print(0)
# 두 선분이 평행한 경우
else:
print(0)
else:
s = (d*e-b*f)/(a*d-b*c)
t = (a*f-c*e)/(a*d-b*c)
# s,t가 0이상 1이하인 경우 교점이 존재한다
if 0<=s<=1 and 0<=t<=1:
print(1)
print(x1+s*(x2-x1),y1+s*(y2-y1))
else:
print(0)
solve(a,b,c,d,e,f)

'python' 카테고리의 다른 글
| [백준] 11668 파이프 청소, python (0) | 2025.10.25 |
|---|---|
| [백준] 1708 볼록 껍질, python (0) | 2025.10.22 |
| [백준] 1707 이분 그래프, python (0) | 2025.10.19 |
| 파이썬 함수 결과값 자동 캐싱(cache, lru_cache), python (0) | 2025.10.15 |
| [백준] 2696 중앙값 구하기, python (0) | 2025.10.14 |