ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 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