접근

이전의 선분 교차 1번 문제와 유사하지만 몇가지 조건이 추가되어 훨씬 어려워졌다..

선분 교차 1번 문제: 2021.05.06 - [코딩/백준 (Python)] - 백준 17386번: 선분 교차 1 (Python)

 

백준 17386번: 선분 교차 1 (Python)

접근 수학 문제를 푸는 느낌이었는데 마지막엔 그것이 아니었다. 숫자를 주고 풀어라 하면 너무 쉽게 답을 구할 수 있지만 이를 코딩해라 라고 하니 제대로 구현을 못했다. 정답률이 낮은데에는

ca.ramel.be

선분 교차 1번 문제에 추가하여 이 문제에서는 세개의 선이 한 직선 위에 있을 수 있다. 따라서 한 선분의 끝점이 다른 선분의 중간에 있을 수도 있고, 다른 선분의 끝점이 될 수도 있다. 더하여 두개의 선분이 한개의 직선 위에 있을 수도 있다.

조건을 따지는 것이 굉장히 까다롭지만 잘 생각해보면 아래와 같은 조건을 얻을 수 있다.

코드

import sys

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


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)

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기