Coding Test/BaekJoon_Python

백준 17386 <선분 교차 1> Python

JunOnJuly 2023. 12. 18. 21:53
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