PS

BOJ 2778 : 측량사 지윤

lickelon 2024. 4. 26. 23:03
  • 문제 링크 : boj.kr/2778
  • 난이도 : G3
  • 태그 : 기하학
 

2778번: 측량사 지윤

측량사 지윤이는 삼각형을 너무 좋아해서 하루에 하나씩 삼각형을 그린다. 그런데 어느 날 밤에 삼각형을 그리려고 하는데, 작업실이 정전 되고 말았다. 그래도 지윤이는 감으로 직선 3개를 그

www.acmicpc.net


코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

struct line {
    ld a;
    ld b;
    ld c;
};

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cout.precision(4);
    cout << fixed;
    int T;
    cin >> T;
    while(T--) {
        line arr[3];
        for(int i = 0; i < 3; i++) {
            cin >> arr[i].a >> arr[i].b >> arr[i].c;
        }

        if(arr[0].a*arr[1].b == arr[1].a*arr[0].b
        || arr[1].a*arr[2].b == arr[2].a*arr[1].b
        || arr[2].a*arr[0].b == arr[0].a*arr[2].b) {
            cout << "0.0000\n";
            continue;
        }
        
        pair<ld, ld> dots[3];
        int d1 = 0, d2 = 1;
        dots[0].first = (arr[d1].b*arr[d2].c-arr[d2].b*arr[d1].c) / (arr[d1].a*arr[d2].b-arr[d2].a*arr[d1].b);
        if(arr[d1].b != 0) dots[0].second = -(arr[d1].a/arr[d1].b) * (dots[0].first) - (arr[d1].c/arr[d1].b);
        else dots[0].second = -(arr[d2].a/arr[d2].b) * (dots[0].first) - (arr[d2].c/arr[d2].b);
        d1 = 1; d2 = 2;
        dots[1].first = (arr[d1].b*arr[d2].c-arr[d2].b*arr[d1].c) / (arr[d1].a*arr[d2].b-arr[d2].a*arr[d1].b);
        if(arr[d1].b != 0) dots[1].second = -(arr[d1].a/arr[d1].b) * (dots[1].first) - (arr[d1].c/arr[d1].b);
        else dots[1].second = -(arr[d2].a/arr[d2].b) * (dots[1].first) - (arr[d2].c/arr[d2].b);
        d1 = 2; d2 = 0;
        dots[2].first = (arr[d1].b*arr[d2].c-arr[d2].b*arr[d1].c) / (arr[d1].a*arr[d2].b-arr[d2].a*arr[d1].b);
        if(arr[d1].b != 0) dots[2].second = -(arr[d1].a/arr[d1].b) * (dots[2].first) - (arr[d1].c/arr[d1].b);
        else dots[2].second = -(arr[d2].a/arr[d2].b) * (dots[2].first) - (arr[d2].c/arr[d2].b);
        
        ld s = 0;
        for(int i = 0; i < 3; i++) {
            s += dots[i].first*dots[(i+1)%3].second - dots[i].second*dots[(i+1)%3].first;
        }
        s = abs(s) / 2;
        cout << s << "\n";
    }

    return 0;
}

풀이

구해야 하는 것 자체는 어렵지 않다. 삼각형을 만든다면 각 직선들의 교점을 찾고 넓이를 구해주면 된다.

삼각형이 생기지 않을 조건을 먼저 고려해주면 쉽다.

다만 구현이 어려우므로 실수하지 않도록 유의해야 한다.

'PS' 카테고리의 다른 글

BOJ 5696 : 숫자 세기  (0) 2024.04.28
BOJ 28137 : 뭐라고? 안들려  (0) 2024.04.27
BOJ 14204 : 표 정렬  (0) 2024.04.25
BOJ 2045 : 마방진  (0) 2024.04.24
BOJ 3064 : Minesweeper  (0) 2024.04.23