접근
이전 문제를 풀고 오면 플레티넘 문제 치고는 생각보다는 쉬운 문제였던 것 같다.
선분 교차 2 문제: 2021.05.06 - [코딩/백준 (Python)] - 백준 17387번: 선분 교차 2 (Python)
이전 문제에서 두 선분이 교차하는지를 확인하였다. 이제 두 선분이 교차할 때 그 교차점을 찾는데, 이는 각 직선이 의미하는 방정식의 연립을 통해 풀 수 있다.
코드
import sys
INF = float('inf')
x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
x3, y3, x4, y4 = map(int, sys.stdin.readline().split())
def ccw(x1, y1, x2, y2, x3, y3):
tmp = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)
if tmp > 0:
return 1
elif tmp < 0:
return -1
else:
return 0
def findA(x1, y1, x2, y2):
if x1 == x2:
return INF
else:
return (y2 - y1) / (x2 - x1)
def findB(x1, y1, a):
return y1 - a * x1
def findFunc(x1, y1, x2, y2):
a = findA(x1, y1, x2, y2)
if a == INF:
if y1 == y2:
return x1, y1, True
return x1, INF, True
b = findB(x1, y1, a)
return a, b, False
def findPoint(x1, y1, x2, y2, x3, y3, x4, y4):
a1, b1, flag1 = findFunc(x1, y1, x2, y2)
a2, b2, flag2 = findFunc(x3, y3, x4, y4)
if flag1:
if b1 == INF:
return a1, a2 * a1 + b2
return x1, y1
if flag2:
if b2 == INF:
return a2, a1 * a2 + b1
return x3, y3
else:
if a2 != a1:
return (b1 - b2) / (a2 - a1), (b1 * a2 - b2 * a1) / (a2 - a1)
else:
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):
if min(x1, x2) == max(x3, x4):
return min(x1, x2), min(x1, x2) * a1 + b1
if max(x1, x2) == min(x3, x4):
return max(x1, x2), max(x1, x2) * a1 + b1
return INF, INF
ans = 0
if ccw(x1, y1, x2, y2, x3, y3) * ccw(x1, y1, x2, y2, x4, y4) == 0 and ccw(x3, y3, x4, y4, x1, y1) * ccw(x3, y3, x4, y4, x2, y2) == 0:
if min(x1, x2) <= max(x3, x4) and max(x1, x2) >= min(x3, x4) and min(y1, y2) <= max(y3, y4) and min(y3, y4) <= max(y1, y2):
ans = 1
elif ccw(x1, y1, x2, y2, x3, y3) * ccw(x1, y1, x2, y2, x4, y4) <= 0 and ccw(x3, y3, x4, y4, x1, y1) * ccw(x3, y3, x4, y4, x2, y2) <= 0:
ans = 1
print(ans)
if ans == 1:
xans, yans = findPoint(x1, y1, x2, y2, x3, y3, x4, y4)
if xans != INF and yans != INF:
if xans % 1 == 0:
xans = round(xans)
if yans % 1 == 0:
yans = round(yans)
print(xans, yans)
더 생각해 볼 것?
...
코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!
반응형
'코딩 > 백준 (Python)' 카테고리의 다른 글
백준 7869번: 두 원 (Python) (0) | 2021.05.07 |
---|---|
백준 2162번: 선분 그룹 (Python, PyPy3) (0) | 2021.05.07 |
백준 17387번: 선분 교차 2 (Python) (0) | 2021.05.06 |
백준 17386번: 선분 교차 1 (Python) (0) | 2021.05.06 |
백준 11758번: CCW (Python) (0) | 2021.05.06 |
최근댓글