리뷰
https://www.acmicpc.net/problem/1374
간단한 정렬 + 우선순위 큐 문제
전역 변수
- n : 강의의 개수를 저장할 변수
- ans : 정답을 저장할 변수
- T : 강의의 시작 시간 st와 종료 시간 et를 정의할 구조체, et를 기준으로 오름차순 정렬한다.
- lst : 강의 정보를 저장할 T타입 배열
- pq : 강의 정보를 저장할 T타입 우선순위 큐
함수
1. cmp
bool cmp(const T& left, const T& right)
정렬 시 사용하기 위한 커스텀 비교 함수
- 매개 변수로 T타입 변수 2개를 각각 left, right로 전달 받는다.
- right의 st가 left의 st보다 크다면 true를 리턴하여 두 요소의 순서를 바꾸어 준다.
문제풀이
- n값을 입력 받고, n개의 요소를 입력 받아 lst배열에 저장해 준다.
- sort함수를 통해 lst배열을 cmp함수를 기준으로 정렬해 준다.
- 정렬 후의 n개의 요소를 순회하며 현재 요소의 st를 변수 time에 저장해 주고, pq에 현재 요소를 push해준다.
- pq가 빌 때 까지 pq의 첫 번째 요소의 et가 time이하라면 pq에서 해당 요소를 빼내어 준다.
- 현재 pq의 size와 ans를 비교해 더 큰 값으로 ans에 저장해 준다.
- ans에 저장된 값을 출력해 준다.
트러블 슈팅
없음
참고 사항
- 입력 받은 강의 번호는 굳이 저장해 줄 필요가 없다.
정답 코드
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n, ans;
struct T {
int st, et;
bool operator<(const T& other) const {
return et > other.et;
}
};
T lst[100000];
priority_queue<T> pq;
bool cmp(const T& left, const T& right) {
return left.st < right.st;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i) {
int a, b, c; cin >> a >> b >> c;
lst[i] = { b, c };
}
sort(lst, lst + n, cmp);
for (int i = 0; i < n; ++i) {
int time = lst[i].st;
pq.push(lst[i]);
while (!pq.empty() && pq.top().et <= time) pq.pop();
ans = max(ans, (int)pq.size());
}
cout << ans;
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G1] 백준 2098번 외판원 순회 C++ 비트마스킹, 다이나믹 프로그래밍 (0) | 2025.03.02 |
---|---|
[G4] 백준 25577번 열 정렬정렬 정 C++ 해시맵, 정렬 (0) | 2025.03.01 |
[G5] 백준 13023번 ABCDE C++ 깊이 우선 탐색 (0) | 2025.03.01 |
[G3] 백준 9466번 텀 프로젝트 C++ 깊이 우선 탐색 (0) | 2025.03.01 |
[P2] 백준 15899번 트리와 색깔 C++ 세그먼트 트리, 오일러 경로 테크닉, 머지 소트 트리 (0) | 2025.02.27 |