※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1708번 문제인 볼록 껍질이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1708
1708번: 볼록 껍질
첫째 줄에 점의 개수 N(3 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 점의 x좌표와 y좌표가 빈 칸을 사이에 두고 주어진다. 주어지는 모든 점의 좌표는 다르다. x좌표와 y좌표의 범
www.acmicpc.net
주어진 점들의 convex hull을 이루는 점의 개수를 구하는 문제이다. convex hull을 구해 그 점의 개수를 세는 것으로 문제를 해결하자.
convex hull을 구하는 알고리즘은 크게 Graham scan과 Andrew's algorithm (Monotone chain algorithm) 두 가지가 잘 알려져있다. 이와 같은 convex hull을 구해내는 알고리즘 중 하나를 이용해 문제를 해결하자. 글쓴이의 코드는 Andrew's algorithm을 이용하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int N;
pair<ll, ll> points[100000]; // 입력받기
vector<pair<ll, ll>> upperhull;
vector<pair<ll, ll>> lowerhull;
int CCW(pair<ll, ll>& A, pair<ll, ll>& B, pair<ll, ll>& C) {
ll ccw = (B.first - A.first) * (C.second - A.second) - (B.second - A.second) * (C.first - A.first);
if (ccw > 0) return 1;
else if (ccw < 0) return -1;
else return 0;
}
void andrew_algorithm() {
sort(points, points + N);
//upperhull
for (int i = 0; i < N; i++) {
auto& cur = points[i];
int cursize = upperhull.size();
while (cursize > 1) {
auto& L = upperhull[cursize - 2], & M = upperhull[cursize - 1];
if (CCW(L, M, cur) != -1) upperhull.pop_back(), cursize--;
else break;
}
upperhull.emplace_back(cur);
}
//lowerhull
for (int i = 0; i < N; i++) {
auto& cur = points[i];
int cursize = lowerhull.size();
while (cursize > 1) {
auto& L = lowerhull[cursize - 2], & M = lowerhull[cursize - 1];
if (CCW(L, M, cur) != 1) lowerhull.pop_back(), cursize--;
else break;
}
lowerhull.emplace_back(cur);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++) cin >> points[i].first >> points[i].second;
andrew_algorithm();
cout << upperhull.size() + lowerhull.size() - 2;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 10254 // C++] 고속도로 (0) | 2023.05.21 |
---|---|
[BOJ 9240 // C++] 로버트 후드 (0) | 2023.05.20 |
[BOJ 15235 // C++] Olympiad Pizza (0) | 2023.05.18 |
[BOJ 15237 // C++] Cipher (0) | 2023.05.17 |
[BOJ 15242 // C++] Knight (0) | 2023.05.16 |