
리뷰

https://www.acmicpc.net/problem/19598
회의실의 개수와 관련된 문제들은 일반적인 회의실 문제와 좀 다른 것 같다.
전역 변수
- n : 회의의 개수를 저장할 변수
- lst : 회의의 시작과 종료 시간을 저장할 배열
함수
없음
문제풀이
- n값을 입력 받고, n개의 회의의 시작과 종료 시간을 lst배열에 입력 받는다. 이 때 종료시간을 앞에 저장해 준다.
- lst배열을 오름차순으로 정렬해 준다, 종료 시간 기준으로 오름차순 되어야 한다.
- 멀티셋 dic을 초기화 해주고, 정답을 저장할 변수 ans를 0으로 초기화 해준다.
- n개의 회의 정보를 순회하며 현재 회의의 시작 시간을 기준으로 dic에서 upper_bound해준다.
- 반환된 이터레이터가 dic의 begin()이라면 dic에 현재 회의의 종료시간을 insert해준다.
- 아니라면 it의 앞쪽 요소를 erase해주고, 현재 회의의 종료 시간을 insert해준다.
- ans에 ans와 dic의 size중 큰 값을 저장해 준다.
- 모든 회의 순회를 마친 경우 ans에 저장된 값을 출력해 준다.
트러블 슈팅
- 그냥 종료시간을 기준으로 정렬하고 시작시간 기준으로 정렬하는 우선순위 큐 하나로 접근했다가 Fail을 받았다.
- 종료할 회의를 선택할 때 그리디한 선택이 추가가 되어야 한다.
참고 사항
- upper_bound로 현재 회의의 시작 시간보다 더 큰 값 중 가장 근접한 값을 구해주었다.
- 그 앞에 요소는 현재 회의의 종료 시간이하인 값 중 가장 큰 값이다.
정답 코드
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int n;
pair<int, int> lst[100000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i) {
int st, et; cin >> st >> et;
lst[i] = { et, st };
}
sort(lst, lst + n);
multiset<int> dic;
int ans = 0;
for (int i = 0; i < n; ++i) {
auto it = dic.upper_bound(lst[i].second);
if (it == dic.begin()) dic.insert(lst[i].first);
else {
dic.erase(--it);
dic.insert(lst[i].first);
}
ans = max(ans, (int)dic.size());
}
cout << ans;
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[P5] 백준 1321번 군인 C++ 세그먼트 트리 (0) | 2025.03.27 |
---|---|
[P5] 백준 10090번 Counting Inversions C++ 세그먼트 트리 (0) | 2025.03.26 |
[G4] 백준 25417번 고속의 숫자 탐색 C++ 너비 우선 탐색 (0) | 2025.03.24 |
[G3] 백준 26086번 어려운 스케줄링 C++ 오프라인 쿼리, 덱, 정렬 (0) | 2025.03.22 |
[G1] 백준 1884번 고속도로 C++ 다익스트라 (0) | 2025.03.21 |