C_C++
C++ - 백준 2075 N번째 큰 수
ncode
2025. 3. 24. 09:29
728x90
반응형
/* 백준 2075 N번째 큰 수
* 풀이
N x N 개의 숫자에서 N 번째 큰 수를 구하는 방법을 생각해 봐야 한다.
우선 전체 입력값들을 vector 에 넣고 sort 하는 방법을 생각할 수 있는데,
이 경우 시간복잡도가 O(n log n) 이고, 1 <= N <= 1,500 이므로 전체 숫자의 개수는
1,500 x 1,500 개 이므로 시간을 조금 더 줄이는 방법을 고민할 필요가 있을 것 같다.
전략:
o priority_queue 를 사용해서 크기를 N 으로 유지하면서 삽입/삭제를 진행
o minimum heap 을 이용하면 마지막에 root에 남아 있는 값이 답이 된다
이 경우 시간복잡도는 O(log n) 이 된다
생각해보면
"채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다."
이런 말은 함정이라고 봐야 한다.
*/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n;
// 최소 힙 (우선순위 큐)을 사용하여 N개의 큰 수를 저장합니다.
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int num;
cin >> num;
// 우선순위 큐의 크기가 N보다 작으면 그냥 넣습니다.
if (pq.size() < n) {
pq.push(num);
} else {
// 현재 숫자가 큐의 최소값보다 크면, 최소값을 빼고 현재 숫자를 넣습니다.
if (num > pq.top()) {
pq.pop();
pq.push(num);
}
}
}
}
// 우선순위 큐의 최소값이 N번째 큰 수입니다.
cout << pq.top() << '\n';
return 0;
}
728x90
반응형