1655 c++ - 가운데를 말해요
2024. 11. 14. 13:20ㆍ🐣/BOJ
우선순위 큐를 사용하는 문제.
처음에는 우선순위 큐, vector의 정렬 중간값을 사용해서 풀이를 진행했는데, 시간초과가 났습니다.
그래서 우선순위 큐 두개를 사용하여 최대힙, 최소힙을 사용하여 풀었습니다.
더보기
vector<int> v;
for (int i = 0; i < n; ++i) {
int t;
cin >> t;
v.push_back(t);
sort(v.begin(), v.end(), less<int>());
cout << v[i / 2] << "\n";
}
더보기
#include <iostream>
#include <queue>
#define FASTIO ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
int n;
int main() {
FASTIO;
cin >> n;
priority_queue<int, vector<int>, greater<int>> pq;
queue<int> q;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
pq.push(t);
for (int j = 0; j < i / 2; j++) {
q.push(pq.top());
pq.pop();
}
cout << pq.top() << "\n";
for (int j = 0; j < i / 2; j++) {
pq.push(q.front());
q.pop();
}
}
return 0;
}
시간 복잡도는 O(NlogN)이 된다.
정답 코드
#include <iostream>
#include <queue>
#define FASTIO ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
int n;
int main() {
FASTIO;
cin >> n;
priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;
for (int i = 0; i < n; ++i) {
int t;
cin >> t;
if (maxHeap.empty() || t <= maxHeap.top()) {
maxHeap.push(t);
} else {
minHeap.push(t);
}
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
} else if (minHeap.size() > maxHeap.size()) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
cout << maxHeap.top() << "\n";
}
return 0;
}
'🐣 > BOJ' 카테고리의 다른 글
9414 c++ - 프로그래밍 대회 전용 부지 (0) | 2024.11.16 |
---|---|
7453 c++ - 합이 0인 네 정수 (3) | 2024.11.15 |
30469 c++ - 호반우가 학교에 지각한 이유 2 (1) | 2024.11.12 |
25511 c++ - 값이 k인 트리 노드의 깊이 (0) | 2024.11.10 |
21735 c++ - 눈덩이 굴리기 (0) | 2024.11.09 |