-
[백준 1064] 평행사변형백준/수학 2025. 10. 24. 00:44
점 3개가 주어지면 3개의 변이 만들어지는데,
평행사변형은 마주보는 변의 길이가 같으므로 두 변의 길이의 합에 2를 곱한 값이 둘레가 된다.

따라서 우선 세 점이 삼각형이 아닐때를 예외처리해준다.
모든 점이 일직선에 있는 경우이다.
이 경우는 기울기가 같은 조건으로 처리해주면 되는데 나누기 연산은 오차가 발생하므로 곱셈으로 바꿔 걸러준다.
// 일직선이면 종료 if ((dots[2].first - dots[1].first) * (dots[1].second - dots[0].second) == (dots[1].first - dots[0].first) * (dots[2].second - dots[1].second)) { cout << -1; return 0; }그 이후에는 3개의 점에서 조합을 통해 2개씩 묶어준뒤 각 길이를 비교해주면 된다.
추가적으로 문제에서 오차를 10-9까지 허용한다고 하니, setprecision을 통해 9이상으로만 설정해주면 된다.
c++ 에서 cout은 double을 출력할때 보기 좋게 setprecision(6)을 default로 적용해준다.
따라서 iomanip 을 통해 fixed << setprecision을 적용해서 출력해줘야한다.
#include <iostream> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> using namespace std; int N; vector<pair<int, int>> dots; void solve() { // 삼각형의 세 변 구하기 double a = sqrt(pow(dots[0].first - dots[1].first, 2) + pow(dots[0].second - dots[1].second, 2)); double b = sqrt(pow(dots[0].first - dots[2].first, 2) + pow(dots[0].second - dots[2].second, 2)); double c = sqrt(pow(dots[1].first - dots[2].first, 2) + pow(dots[1].second - dots[2].second, 2)); // 변 조합으로 평행사변형 둘레 구하기 double r1 = 2 * (a + b); double r2 = 2 * (a + c); double r3 = 2 * (b + c); double ans1 = max(r1, max(r2, r3)); double ans2 = min(r1, min(r2, r3)); cout << fixed << setprecision(15) << ans1 - ans2; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int x, y; for (int i = 0; i < 3; i++) { cin >> x >> y; dots.push_back(make_pair(x, y)); } // 일직선이면 종료 if ((dots[2].first - dots[1].first) * (dots[1].second - dots[0].second) == (dots[1].first - dots[0].first) * (dots[2].second - dots[1].second)) { cout << -1; return 0; } solve(); return 0; }'백준 > 수학' 카테고리의 다른 글
[백준 1485] 정사각형 (0) 2025.10.23 [백준 11653] 소인수분해 (0) 2025.10.23 [백준 2609] 최대공약수와 최소공배수 (0) 2025.10.23 [백준 1929] 소수 구하기 (0) 2025.08.26