리뷰
우선순위 큐 문제는 풀어도 풀어도 어려운 것 같다 ㅠㅠ
https://www.acmicpc.net/problem/13334
전역 변수
- n, d, ans : 사람의 수 n, 철로의 길이 d, 구간에 포함되는 사람의 최대 수를 저장할 변수 ans
- nums : 집과 사무실의 좌표를 저장할 pair<int, int>타입 배열, 크기는 10만으로 초기화 한다.
함수
없음
문제풀이
- n값을 입력 받고 nums배열에 집과 사무실 위치를 입력 받아준다.
- s보다 e가 크다면 두 수를 바꿔주고, 도착 시간을 기준으로 오름차순 정렬을 할 것이기 때문에 e, s순으로 저장한다.
- sort메서드를 통해 nums배열을 0부터 n - 1인덱스를 오름차순으로 정렬해 준다.
- 정수형 타입의 우선순위 큐 pq를 초기화 해주고 오름차순으로 우선 정렬한다.
- d값을 입력 받고 nums배열을 순회하는 반복문을 만들어 준다.
- 만약 도착 지점 - 시작 지점이 d보다 작거나 크면 pq에 시작지점을 추가해 준다.
- pq에 도착지점 - 철로의 길이보다 작은 시작지점들은 모두 pop해준다.
- pq에 남은 정수들의 개수를 ans를 통해 최대값을 갱신해 준다.
- 모든 작업이 완료된 후에 ans에 저장된 값을 출력해 준다.
참고 사항
오름차순이 아닌 도착 시간을 기준으로 오름차순 정렬을 해주어야 문제를 정확히 풀 수 있다.
정답 코드
#include<iostream>
#include<queue>
#include<algorithm>
#define pii pair<int, int>
using namespace std;
int n, d, ans;
pii nums[100000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
int s, e; cin >> s >> e;
if (s > e) swap(s, e);
nums[i] = { e, s };
}
sort(nums, nums + n);
priority_queue<int, vector<int>, greater<int>> pq;
cin >> d;
for (int i = 0; i < n; i++) {
pii cur = nums[i];
int s = cur.second, e = cur.first;
if (e - s <= d) pq.push(s);
else continue;
while (!pq.empty() && pq.top() < e - d) pq.pop();
ans = max(ans, (int)pq.size());
}
cout << ans;
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G4] 백준 4485번 녹색 옷 입은 애가 젤다지? C++ 다익스트라, 최단 경로 (0) | 2024.10.12 |
---|---|
[G2] 백준 2871번 아름다운 단어 C++ 그리디 알고리즘, 우선순위 큐, 구현 (0) | 2024.10.11 |
[G3] 백준 1701번 Cubeditor C++ KMP, 문자열, 브루트포스 알고리즘 (1) | 2024.10.10 |
[P5] 백준 1786번 찾기 C++ KMP, 문자열, LPS (0) | 2024.10.10 |
[G3] 백준 16934번 게임 닉네임 C++ 트라이, 문자열, 해시맵 (1) | 2024.10.10 |