[C++] 백준 1198 삼각형으로 자르기

semin·2023년 10월 22일

https://www.acmicpc.net/problem/1198
제목 : 삼각형으로 자르기
난이도 : Silver II

풀이

주어진 점들 중에 3개를 고르고, 그 중 제일 넓이가 큰 값을 구하면 된다.
좌표 평면에서 N개의 점으로 이루어진 다각형의 넓이를 구하는 신발끈 공식을 이용하면 된다.

그리고 넓이는 무조건 2로 나누어져 소수가 0 아니면 0.5로만 이루어져 있다.
2로 나누어 떨어지지 않으면 ".5" 를 붙이면 된다.

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int getarea(pair<int, int> a, pair<int, int> b, pair<int, int> c) {
    int area;
    auto [a1, a2] = a;
    auto [b1, b2] = b;
    auto [c1, c2] = c;

    int tmp1 = a1 * b2 + b1 * c2 + c1 * a2;
    int tmp2 = a2 * b1 + b2 * c1 + c2 * a1;
    area = abs(tmp1 - tmp2);
    return area;
}

int main()
{
    vector<pair<int, int>> map;
    int N;
    int x, y, maxsize = -999;
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> x >> y;
        map.push_back({ x, y });
    }

    for (int i = 0; i < map.size() - 2; i++) {
        for (int j = i + 1; j < map.size() - 1; j++) {
            for (int k = j + 1; k < map.size(); k++) {
                maxsize = max(maxsize, getarea(map[i], map[j], map[k]));
            }
        }
    }
    if (maxsize % 2 == 0) printf("%d.0",maxsize / 2);
    else printf("%d.5", (maxsize - 1) / 2);
}

profile
게임 프로그래밍 공부

0개의 댓글