사고쳤어요
[백준] 1064 평행사변형 (C++) 본문
링크: 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});
}
'백준 > Silver' 카테고리의 다른 글
[백준] 1012 유기농 배추(C++) (0) | 2023.03.08 |
---|---|
[백준] 1402 아무래도이문제는A번난이도인것같다(C++) (0) | 2023.02.10 |
[백준] 1343 폴리오미노(C++) (0) | 2023.02.10 |
[백준] 1340 연도진행바(C++) (0) | 2023.02.09 |
[백준] 1331 나이트 투어 (C++) (0) | 2023.01.19 |