728x90

๋ฌธ์ œ

๋‘ ๋‹ค๊ฐํ˜•์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‘ ๋‹ค๊ฐํ˜•์˜ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋งŒ์•ฝ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด ๋‹ค์Œ์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ๋‹ค๊ฐํ˜•๋งŒ์„ ๊ตฌํ•˜๋„๋ก ํ•œ๋‹ค. ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์ด๋‹ค.

 

์ž…๋ ฅ 1

3 3
0 0
1 0
1 1
0 1
0 0
1 0

์ถœ๋ ฅ 1

5
0 0
2 0
2 1
1 2
0 1

์ฝ”๋“œ

#include<iostream>
#include<algorithm>
#include<vector>
#define x first
#define y second
using namespace std;

//2244๋ฒˆ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ
//Convex Hull(CCW(Counter Clock Wise)) ์‚ฌ์šฉ

typedef pair<long long, long long> Point2f;
Point2f a[1010];
Point2f b[1010];

//counter clock wise : ์ขŒํšŒ์ „ํ•˜๋Š”์ง€ ํŒ๋‹จ
//๋ฒกํ„ฐ AB์™€ ๋ฒกํ„ฐ AC์˜ CW/CCW
// 0๋ณด๋‹ค ํฌ๋ฉด ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” ๊ฒƒ, 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” ๊ฒƒ
//int์— 1LL์„ ๊ณฑํ•ด์ฃผ๋ฉด long long์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
int ccw(Point2f a, Point2f b, Point2f c) {
    long long res = a.x * b.y + b.x * c.y + c.x * a.y;
    res -= b.x * a.y + c.x * b.y + a.x * c.y;
    if (res > 0) return 1;          //์‹œ๊ณ„ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ
    if (res) return -1;             //์‹œ๊ณ„ ๋ฐฉํ–ฅ
    return 0;                           //ํ‰๋ฉด์ƒ
}

long long dist(Point2f a, Point2f b) {
    long long dx = 1LL*a.x - b.x;
    long long dy = 1LL * a.y - b.y;
    return dx * dx + dy * dy;
}

int main() {

    vector<Point2f> arr;
    int aNum, bNum;
    int xTmp, yTmp;
    int pIdx = 0;
    cin >> aNum >> bNum;
    pIdx = aNum * bNum;
    for (int i = 0; i < aNum; i++) {
        cin >> xTmp >> yTmp;
        a[i].x = xTmp; a[i].y = yTmp;
    }
    for (int i = 0; i < bNum; i++) {
        cin >> xTmp >> yTmp;
        b[i].x = xTmp; b[i].y = yTmp;
    }
    //๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ ๋“ค vector ์ œ์ž‘
    for (int i = 0; i < aNum; i++) {
        for (int j = 0; j < bNum; j++) {
            arr.push_back(Point2f{ a[i].x + b[j].x,a[i].y + b[j].y });
        }
    }

    //arr์˜ ์ตœ์†Œ ๊ฐ’์„ ์ฐพ์•„์„œ 0๋ฒˆ ์ž๋ฆฌ์™€ ๋ฐ”๊ฟˆ(0๋ฒˆ์„ ์ œ์ผ ์ž‘์€ ๊ฐ’์œผ๋กœ ์„ค์ •)
    swap(arr[0], *min_element(arr.begin(), arr.end()));
    //0๋ฒˆ์„ ์ œ์™ธํ•œ ์ ๋“ค์„ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ ฌ
    //[&]{}๋Š” ๋žŒ๋‹ค์‹์œผ๋กœ์จ ํ•ด๋‹น ํ•จ์ˆ˜์—๋”ฐ๋ผ์„œ sort๋ฅผ ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•จ
    sort(arr.begin() + 1, arr.end(), [&](Point2f& a, Point2f& b) {
        int cw = ccw(arr[0], a, b);
        //cw๊ฐ€ 0 ์ด์ƒ์ด๋ฉด ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์ด๊ณ  true๋ฅผ ๋ฐ˜ํ™˜ 0์ด๋ฉด false ๋ฐ˜ํ™˜, cw๊ฐ€ -1์ธ ๊ฒฝ์šฐ(์‹œ๊ณ„ ๋ฐฉํ–ฅ) if๋ฌธ์„ ๋“ค์–ด์˜ค์ง€ ์•Š์Œ
        if (cw) return cw > 0;          
        return dist(arr[0], a) < dist(arr[0], b); //cw๊ฐ€ -1์ธ ๊ฒฝ์šฐ ๊ธฐ์ค€์  arr[0]์—์„œ์˜ ๊ฑฐ๋ฆฌ์ˆœ์œผ๋กœ ์ •๋ ฌ
        });

    vector<Point2f> hull;
    for (int i = 0; i < arr.size();i++) {
        while (hull.size() >= 2 && ccw(hull[hull.size() - 2], hull.back(), arr[i]) <= 0) {
            hull.pop_back();
        }
        hull.push_back(arr[i]);
    }
    cout << hull.size() << "\n";
    for (int i = 0; i < hull.size(); i++) {
        cout << hull[i].x << " " << hull[i].y << "\n";
    }

    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

convex hull๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

convex hull์€ ์ฃผ์–ด์ง„ ์ ์—์„œ ์™ธ๊ณฝ์„ ์„ ์ด๋ฃจ๋Š” ์ ๋“ค์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค์˜ ํ•ฉ ๋˜ํ•œ ๊ณต๊ฐ„์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— convex hull ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ์˜ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ https://justicehui.github.io/ioi/2019/05/21/BOJ2244/ ์—์„œ ๋”ฐ์™”๋‹ค.

๋ช‡๊ฐ€์ง€ ๋žŒ๋‹ค์‹์ด๋ผ๋˜์ง€ auto์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋‚˜์—๊ฒŒ ์–ด๋ ค์›Œ์„œ for๋ฌธ์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ฃผ์„์„ ๋‹ฌ์•„์„œ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค. ๊ธฐ์กด์˜ ๋‹ค๋ฅธ๊ณณ์—์„œ ์ฐพ์•„์„œ convex hull์„ ๊ตฌํ˜„ํ•ด์„œ ๋„ฃ์–ด๋ณด์•˜๋Š”๋ฐ ์˜ˆ์ œ๋ฅผ ๋„ฃ์–ด๋ณด์•˜์„ ๋•Œ๋Š” ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋‚˜์™”์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฑ์ค€์—์„œ ํ…Œ์ŠคํŠธ ํ• ๋•Œ๋งˆ๋‹ค 

์ด๋Ÿฌํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋‚˜ ์ถœ๋ ฅ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์™€์„œ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋ชฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ถ„ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ์ฐธ๊ณ ํ•ด์„œ ํ•ด๋ณด์•˜๋Š”๋ฐ ์•„๋งˆ sortingํ•˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ๋‹ค..

convex hull ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๊ธ€์€ https://kbw1101.tistory.com/50 ์—ฌ๊ธฐ ๋ธ”๋กœ๊ทธ์— ์•„์ฃผ ์นœ์ ˆํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

๋ฐ˜์‘ํ˜•

+ Recent posts