본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 1064 평행사변형

by Alan_Kim 2024. 2. 21.
728x90
반응형

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

 

1064번: 평행사변형

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나

www.acmicpc.net

 

 

문제 해결

  • 3 점이 주어졌고 어떻게 연결하느냐에 따라 평행사변형 모양이 달라질 수 있다.
    • 점 a, b, c가 있다고 하면 abc 연결과 acb연결은 다르다
  • 만약 점이 일직선으로 있다면 평행사변형을 만들 수 없다.
  • 따라서 그 경우는 -1.0을 출력하고 나머지 경우는 여러가지 연결을 해보고 가장 짧은 선분 합과 가장 긴 선분 합 차를 구하고 2배를 해주면 된다.

 

주의할 점

  • 처음에 점의 평행을 Cos값을 통해 구할려고 했다.
  • 하지만 이 경우 문제가 생기는 것이 있는데 바로 0.99999과 같은 1인데 무리수의 선분 길이등으로 인하여 나누기 계산을 할 때 어려움을 겪는 경우가 존재한다. 그래서 오답 채점으로 나오기도 한 것 같다.
  • 최대한 계산을 할 때 나누기를 안쓰는 것이 좋은 것 같다. 최대한 곱셈으로 판별하도록 (조밀성이라고 표현하는 것 같다.)

 

CODE

import sys
input = sys.stdin.readline
import math

def solve(xa, ya, xb, yb, xc, yc):
    if ((xa - xb) * (ya - yc) == (ya - yb) * (xa - xc)):  # 직선 ab와 직선 ac가 평행 또는 일치할 때
        return -1.0

    ab = math.sqrt((xa - xb) ** 2 + (ya - yb) ** 2)
    ac = math.sqrt((xa - xc) ** 2 + (ya - yc) ** 2)
    bc = math.sqrt((xb - xc) ** 2 + (yb - yc) ** 2)
    l = [ab+ac, ab+bc, ac+bc]
    result = max(l)-min(l)
    return 2*result
if __name__ == "__main__":
    xa, ya, xb, yb, xc, yc = map(int, input().split())
    answer = solve(xa, ya, xb, yb, xc, yc)
    print(answer)

 

728x90
반응형

댓글