728x90
https://www.acmicpc.net/problem/17386
17386번: 선분 교차 1
첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.
www.acmicpc.net
CCW 알고리즘을 활용하면 풀 수 있는 문제입니다.
def solution(x1, y1, x2, y2, x3, y3, x4, y4):
# CCW 알고리즘은 기본적으로 주어진 점선들의 회전방향을 알 수 있음
# 어떤 직선을 기준으로 두 점이 양방향에 있으면 직선과 각 점을 이었을 때 회전방향은 반대임
# 각 선분을 기준으로 나머지 선분의 각 점이 이루는 회전방향이 모두 다르면
# 각 선분을 이루는 점은 나머지 선분을 기준으로 반대쪽에 있음 -> 교차함
# 선분 리스트
line_list = [[x1, y1, x2, y2], [x3, y3, x4, y4]]
for i in range(2):
# 선분
line = line_list[i]
mul_ccw = 1
for j in range(2):
# 점
point = line_list[1-i][2*j:2*j+2]
mul_ccw *= CCW(line, point)
if mul_ccw > 0:
print(0)
return
else:
if i == 1:
print(1)
return
# CCW
def CCW(line, point):
# x, y 리스트
x_list = []
y_list = []
for i in range(0, 4, 2):
x_list.append(line[i])
y_list.append(line[i+1])
x_list.append(point[0])
y_list.append(point[1])
x_list.append(line[0])
y_list.append(line[1])
# 합
ccw_sum = 0
for idx in range(3):
ccw_sum += x_list[idx]*y_list[idx+1]
ccw_sum -= y_list[idx]*x_list[idx+1]
return ccw_sum
x1, y1, x2, y2 = map(int, input().split())
x3, y3, x4, y4 = map(int, input().split())
solution(x1, y1, x2, y2, x3, y3, x4, y4)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 1305 <광고> Python (2) | 2023.12.22 |
---|---|
백준 1786 <찾기> Python (0) | 2023.12.21 |
백준 25308 <방사형 그래프> Python (0) | 2023.12.18 |
백준 11758 <CCW> Python (1) | 2023.12.17 |
백준 2166 <다각형의 면적> Python (0) | 2023.12.16 |