개인사
[G4] 백준 1689번 겹치는 선분 C++ 그리디 알고리즘, 정렬, 우선순위 큐 본문
728x90

리뷰

https://www.acmicpc.net/problem/1689
1차원 좌표계 위에 선분이 최대로 겹쳐있는 부분의 겹친 선분의 개수를 구하는 문제
전역 변수
- N : 배열의 최대 크기를 정의할 상수 변수
- n : 선분의 개수를 저장할 변수
- a : 선분의 시작점과 끝 점을 저장할 배열
함수
없음
문제풀이
- n값을 입력 받고, n개의 선분의 시작과 끝점의 좌표를 입력 받아 a배열을 초기화한다.
- sort함수를 통해 a배열을 오름차순으로 정렬해준다.
- 변수 ans를 0으로 초기화 하고, 정수형 오름차순 우선순위 큐 pq를 초기화한다.
- n개의 선분을 순회하며 현재 선분의 시작 점보다 끝점의 좌표가 작거나 같은 선분을 pq에서 모두 빼내어준다.
- pq에 현재 선분의 끝 점을 push한다.
- ans를 현재 pq의 size()와 비교하여 더 큰 값으로 ans에 저장한다.
- ans에 저장된 값을 출력한다.
트러블 슈팅
없음
참고 사항
- 선분의 끝 점에서 겹치는 것은 겹치는 것으로 세지 않는다.
- 선분의 좌표는 절댓값이 10억보다 작거나 같은 정수이다, int범위로 해결이 가능하다.
정답 코드
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
using pii = pair<int, int>;
const int N = 1e6;
int n;
pii a[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i) {
int s, t; cin >> s >> t;
a[i] = { s, t };
}
sort(a, a + n);
int ans = 0;
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < n; ++i) {
pii d = a[i];
while (!pq.empty() && pq.top() <= d.first) pq.pop();
pq.push(d.second);
ans = max(ans, (int)pq.size());
}
cout << ans;
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G5] 백준 23284번 모든 스택 수열 C++ 백트래킹 (0) | 2025.12.15 |
|---|---|
| [G5] 백준 21758번 꿀 따기 C++ 그리디 알고리즘, 누적합 (0) | 2025.12.14 |
| [G5] 백준 16974번 레벨 햄버거 C++ 다이나믹 프로그래밍, 재귀, 분할 정복 (0) | 2025.12.12 |
| [G3] 백준 1937번 욕심쟁이 판다 C++ 깊이 우선 탐색, 다이나믹 프로그래밍, DFS, DP (0) | 2025.12.11 |
| [G4] 백준 16562번 친구비 C++ 너비 우선 탐색 (0) | 2025.12.10 |
