๋ฌธ์
๋ ๋ค๊ฐํ์ด ์ฃผ์ด์ก์ ๋, ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ง์ฝ ๋ฏผ์ฝํ์คํค ํฉ์ด ์ฌ๋ฌ ๊ฐ์ ๋ค๊ฐํ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๋ฉด ๋ค์์ ์ฐ์ ์์์ ๋ฐ๋ผ ํ๋์ ๋ค๊ฐํ๋ง์ ๊ตฌํ๋๋ก ํ๋ค. ๋ฒํธ๊ฐ ์์ ๊ฒ์ด ์ฐ์ ์์๊ฐ ๋์ ๊ฒ์ด๋ค.
์ ๋ ฅ 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'/*
'์๊ณ ๋ฆฌ์ฆ > BaekJoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] BOJ 6087๋ฒ: ๋ ์ด์ ํต์ (0) | 2022.06.28 |
---|---|
[C++] BOJ 2749๋ฒ: ํผ๋ณด๋์น ์ 3 (0) | 2022.06.20 |
[C++] BOJ 2933๋ฒ: ๋ฏธ๋ค๋ (0) | 2022.06.13 |
[C++] BOJ 1655๋ฒ: ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2022.06.08 |
[C++] BOJ 3190๋ฒ: ๋ฑ (0) | 2022.03.25 |