[백준]1064 - 평행사변형

정승환·2022년 2월 16일

Algorithm

목록 보기
4/5

문제

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)
이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.
만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.

첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.

입력 예시

1 2 3 4 8 7

접근

세 점이 한 직선 위에 있으면 평행사변형을 만들 수 없다. 세 점이 만드는 2개의 직선의 기울기가 같다면, 남은 하나의 직선 역시 자연스럽게 같은 기울기를 가지게 되고, 이는 세 점이 한 직선 위에 존재한다는 것을 의미한다.
세 점이 만드는 3개의 직선의 기울기가 모두 달라 삼각형을 만드는 경우, 삼각형의 각각의 변이 대각선이 되는 평행사변형 3개를 만들 수 있다.

이 때 가장 둘레 길이가 가장 긴 평행사변형은 (중간 변 + 가장 긴 변)*2, 둘레 길이가 가장 짧은 평행사변형은(중간 변 + 가장 짧은변)*2의 길이를 가진다. 이 둘의 둘레길이 차이는 (가장 긴 변 - 가장 짧은 변)*2 이 된다.
좌표를 통해 각 변의 길이를 구하기 위해 피타고라스 정리를 이용한다.

풀이

XA, YA, XB, YB, XC, YC = map(int,input().split())

answer = 0.0
if XA == XB == XC or YA == YB == YC :
    answer = -1.0
elif YA-YB != 0 and YA-YC != 0 and YB-YC != 0 \
    and (XA-XB)/(YA-YB) == (XB-XC)/(YB-YC) == (XA-XC)/(YA-YC):
    answer = -1.0
else :
    dAB = ((XA-XB)**2 + (YA-YB)**2) ** (1/2)
    dBC = ((XB-XC)**2 + (YB-YC)**2) ** (1/2)
    dCA = ((XC-XA)**2 + (YC-YA)**2) ** (1/2)

    answer = (max(dAB, dBC, dCA) - min(dAB, dBC, dCA)) * 2

print(answer)

ZeroDivisionError를 해결하기 위한 더 좋은 방법이 있을 것이다.

profile
Better than yesterday

0개의 댓글