본문 바로가기

Algorithm

선분 교차 1 (17386번) - 백준 (BOJ)

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

 

17386번: 선분 교차 1

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.

www.acmicpc.net

 

 

백준 - 선분 교차 1 (17386번)

 

난이도 : Gold 3

알고리즘&자료구조 : Geometry (기하학)


★ 핵심 Idea ★

 

◎ 선분 1을 포함하는 직선의 방정식을 A, 선분 2를 포함하는 직선의 방정식을 B라고 설정한다.

 

두 선분 1, 2가 교차하려면,

아래의 두 가지 경우를 동시에 만족해야 한다.

 

① 직선 B로 인해 나눠지는 평면 B1과 B2가 있다고 하면, 선분 1의 양 끝 점이 서로 다른 평면에 위치해야 한다.

 직선 A로 인해 나눠지는 평면 A1과 A2가 있다고 하면, 선분 2의 양 끝 점이 서로 다른 평면에 위치해야 한다.

 

위의 조건을 코드로 구현하면 된다.

주의할 점은, 두 선분 중 하나라도 y축에 평행하는 경우 예외 처리가 필요하다.

 

 

< 전체 코드 >

 

def make_line(x1, y1, x2, y2):
    def line(x):
        return (y2-y1) / (x2-x1) * (x-x1) + y1

    if x1 == x2:
        return 'v'
    return line


def main():
    x11, y11, x12, y12 = map(int, input().split())
    x21, y21, x22, y22 = map(int, input().split())
    (x11, y11, x12, y12) =  (x11, y11, x12, y12) if x11 <= x12 else (x12, y12, x11, y11)
    (x21, y21, x22, y22) =  (x21, y21, x22, y22) if x21 <= x22 else (x22, y22, x21, y21)
    (x11, y11, x12, y12, x21, y21, x22, y22) =\
        (x21, y21, x22, y22, x11, y11, x12, y12) if x11 == x12 else (x11, y11, x12, y12, x21, y21, x22, y22)
    line_1 = make_line(x11, y11, x12, y12)
    line_2 = make_line(x21, y21, x22, y22)
    
    if line_1 == 'v' or (y21 - line_1(x21)) * (y22 - line_1(x22)) > 0:
        print(0)
    elif line_2 == 'v':
        print(1 if x11 < x21 < x12 else 0)
    elif (y11 - line_2(x11)) * (y12 - line_2(x12)) > 0:
        print(0)
    else:
        print(1)


if __name__ == '__main__':
    main()

 

'Algorithm' 카테고리의 다른 글

센서 (2212번) - 백준 (BOJ)  (0) 2023.09.25
열쇠 (9328번) - 백준 (BOJ)  (0) 2023.09.23
마라톤 2 (10653번) - 백준 (BOJ)  (0) 2023.09.22
주식 (12014번) - 백준 (BOJ)  (0) 2023.09.22
새로운 게임 (17780번) - 백준 (BOJ)  (0) 2023.09.15