Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- JanusGateway
- Value too long for column
- 개성국밥
- PersistenceContext
- JanusWebRTCGateway
- VARCHAR (1)
- 겨울 부산
- python
- JanusWebRTC
- preemption #
- mp4fpsmod
- 자원부족
- addhooks
- 코루틴 컨텍스트
- table not found
- tolerated
- PytestPluginManager
- vfr video
- ErrorResponse
- Spring Batch
- taint
- terminal
- kotlin
- 달인막창
- pytest
- 코루틴 빌더
- 깡돼후
- RouteLocator
- JanusWebRTCServer
- gitflow-shFlags
Archives
너와 나의 스토리
[BOJ] 1708 볼록 껍질 본문
반응형
문제: https://www.acmicpc.net/problem/1708
문제 풀이:
Convex Hull 알고리즘 중 Graham's Scan 방법을 이용하여 풀었다.
(다른 방법으로는 monotone chain convex hull 방법이 있다)
입력 받은 좌표 중 가장 작은 y값을 가진 점 중 가장 작은 x값을 가진 점을 기준점으로 삼는다.
그 기준점과 모든 점과의 기울기를 기준으로 좌표를 정렬한다.
기울기가 작은 점들부터 비교 연산을 시작한다.
처음에 벡터(나는 벡터를 스택처럼 사용)에 기준점과 기울기가 가장 작은 점, 두 점을 백터에 넣는다.
그 후 인덱스(idx)를 증가시켜가며 현재 벡터의 top에 있는 2점을 기준으로 ccw가 양수이면 해당 좌표의 인덱스를 벡터에 넣고 idx++
ccw가 음수이면 잘못된 점을 넣은 것이므로 idx는 유지하고 벡터 pop_back()
ccw가 0이면 일직선에 있는 것이므로 벡터 pop_back()하고 현재 값 넣고 idx++
소스 코드:
typedef long double ld;
typedef pair<ld, ld> P;
typedef pair<P, P> PP;
vector<P> v;
vector<int> st;
int startPoint,res;
ld x, y;
bool cmp(const P a, const P b) {
if ((x - b.first)*(y - a.second) == (x - a.first)*(y - b.second)) {
if (a.second == b.second)
return a.first< b.first;
else
return a.second < b.second;
}
else {
return (x - b.first)*(y - a.second) < (x - a.first)*(y - b.second);
}
}
ld ccw(PP a,P b) {
P a1 = a.first,a2=a.second;
ld ccw11 = (a1.first*a2.second + a2.first*b.second + b.first*a1.second)
- (a2.first*a1.second + b.first*a2.second + a1.first*b.second);
return ccw11;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
ld q, w;
cin >> q >> w;
v.push_back({ q,w });
if (v[startPoint].second > w ||(v[startPoint].second==w && v[startPoint].first> q)) {
startPoint = i;
}
}
x = v[startPoint].first;
y = v[startPoint].second;
sort(v.begin(), v.end(), cmp);
st.push_back(0);
st.push_back(1);
int t = 1;
int idx = 2;
while (1) {
if (idx == n) break;
ld ccwV = ccw(make_pair(v[st[t-1]], v[st[t]]), v[idx]);
if (ccwV>0) {
st.push_back(idx);
idx++;
t++;
}
else if (ccwV == 0) {
st.pop_back();
st.push_back(idx);
idx++;
}
else {
st.pop_back();
t--;
}
}
cout << st.size() << '\n';
return 0;
}
반응형
'Algorithm > 기하' 카테고리의 다른 글
[BOJ] 11758 CCW (0) | 2021.01.05 |
---|---|
[BOJ] 3878 점 분리 (0) | 2019.08.27 |
[BOJ] 6439 교차 (0) | 2019.08.21 |
[BOJ] 2162 선분 그룹 (0) | 2019.08.20 |
[BOJ] 2166 다각형의 면적 (0) | 2019.08.20 |
Comments