Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

사고쳤어요

[백준] 1064 평행사변형 (C++) 본문

백준/Silver

[백준] 1064 평행사변형 (C++)

kevinmj12 2023. 1. 18. 01:58

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

 

1064번: 평행사변형

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

www.acmicpc.net

문제

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)

이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.

만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.

입력

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

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.


풀이

먼저 점 3개가 주어졌을 때 평행사변형은 한 변을 중심으로 다른 한 점을 대칭시키면 만들 수 있다. 이 때 다음과 같이 3가지의 평행사변형을 만들 수 있다.

 각 평행사변형의 둘레는 삼각형의 두 변의 합 * 2와 같다. 따라서 가능한 모든 평행사변형의 둘레를 구해 최댓값과 최솟값의 차이를 구하면 된다.

 주의할 점은 세 점이 한 직선상에 있을 때는 평행사변형이 만들어지지 않으므로 -1을 출력해야 한다는 것이다.

 또한 cout은 소수점 아래 6자리까지밖에 출력되지 않아 확인이 필요하다. 이것 덕분에 삽질을 오래 했다.

코드

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

int main(){
    double xA, yA, xB, yB, xC, yC;
    cin >> xA >> yA >> xB >> yB >> xC >> yC;
    if (xA == xB && xB == xC){ // x좌표들이 모두 동일할 때(x증가량이 0이기때문에 기울기로 판단 불가능)
        cout << -1;
        return 0;
    }
    if ((yB-yA)/(xB-xA) == (yC-yB)/(xC-xB)){ // 기울기(y증가량/x증가량)가 모두 동일할 때
        cout << -1;
        return 0;
    }
    double parallelogram1 = 2 * (sqrt(pow(xA - xB, 2) + pow(yA - yB, 2)) + sqrt(pow(xA - xC, 2) + pow(yA - yC, 2))); // (xA, yA)를 대칭시킨 평행사변형
    double parallelogram2 = 2 * (sqrt(pow(xB - xA, 2) + pow(yB - yA, 2)) + sqrt(pow(xB - xC, 2) + pow(yB - yC, 2))); // (xB, yB)를 대칭시킨 평행사변형
    double parallelogram3 = 2 * (sqrt(pow(xC - xA, 2) + pow(yC - yA, 2)) + sqrt(pow(xC - xB, 2) + pow(yC - yB, 2))); // (xB, yB)를 대칭시킨 평행사변형


    cout.precision(16); // 기본적으로 cout을 수행하면 소수점 아래 6자리까지밖에 출력되지 않는다.
    cout << max({parallelogram1, parallelogram2, parallelogram3}) - min({parallelogram1, parallelogram2, parallelogram3});
}