반응형
리뷰
https://www.acmicpc.net/problem/10775
set과 upper_bound를 활용한 그리디 문제
전역 변수
- g : 게이트의 수를 저장할 변수
- p : 비행기의 수를 저장할 변수
- ans : 정답을 저장할 변수
- dic : 게이트의 상태를 저장할 정수형 집합
함수
없음
문제풀이
- g, p에 값을 입력 받고, dic에 1 ~ g까지의 정수를 insert해준다.
- p번의 while루프를 개행해 주고, 매 루프마다 게이트 번호를 입력 받아준다.
- upper_bound 함수를 통해 dic에서 gate보다 큰 값의 이터레이터를 it에 저장해 준다.
- 만약 it이 dic의 begin이라면 ans를 출력하고 main함수를 리턴해 준다.
- 아니라면 dic에서 it의 앞쪽 데이터를 erase처리해 주고, ans를 1만큼 증가시켜 준다.
- 탐색이 종료될 때 까지 main함수가 return되지 않았다면 ans에 저장된 값을 출력해 준다.
트러블 슈팅
없음
참고 사항
- upper_bound를 통해 x보다 큰 값을 구하고 이터레이터를 감소시키면 x보다 작은 값 중 최대값을 구할 수 있다.
- 다만, 이터레이터가 자료구조의 begin이라면 x보다 작은 값이 존재하지 않는 것이다.
- set은 레드-블랙 트리 기반의 정렬된 자료구조이며, insert, upper_bound, erase모두 LogN의 시간 복잡도를 가진다.
정답 코드
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int g, p, ans;
set<int> dic;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> g >> p;
for (int i = 1; i <= g; ++i) dic.insert(i);
while (p--) {
int gate; cin >> gate;
auto it = dic.upper_bound(gate);
if (it == dic.begin()) {
cout << ans;
return 0;
}
else {
dic.erase(--it);
ans++;
}
}
cout << ans;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G5] 백준 17836번 공주님을 구해라! C++ 다익스트라 (0) | 2025.02.11 |
---|---|
[G5] 백준 20008번 몬스터를 처치하자! C++ 백트래킹 (0) | 2025.02.08 |
[Lv3] 소프티어 택배 마스터 광우 C++ 백트래킹 (0) | 2025.02.08 |
[G5] 백준 16987번 계란으로 계란치기 C++ 백트래킹 (0) | 2025.02.07 |
[G4] 백준 1662번 압축 C++ 스택 (0) | 2025.02.06 |