문제
풀이
우선순위 큐
참고:
수열에서 중앙값을 찾는 것은 쉽지만, 데이터가 추가되는 도중에 중앙값을 찾는 것은 어렵다. 알고리즘은 다음으로 진행된다.
- 최대 힙과 최소 힙으로 수를 나눠서 입력받는다.
- 중앙값은 최대 힙의 top에 위치한다.
- 최대 힙의 크기는 최소 힙의 크기보다 1 크거나 같다.
- 최대 힙의 최댓값이 최소 힙의 최솟값보다 크다면, 그 값을 서로 바꾼다.
코드
#include <iostream>
#include <queue>
using namespace std;
priority_queue<int> smaller; // 최대 힙
priority_queue<int, vector<int>, greater<int>> bigger; // 최소 힙
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
int temp;
for (int i = 0; i < N; ++i)
{
cin >> temp;
// samller의 크기는 bigger의 크기보다 1 크거나 같다.
if (smaller.empty())
{
smaller.push(temp);
}
else if (smaller.size() == bigger.size())
{
smaller.push(temp);
}
else
{
bigger.push(temp);
}
// smaller의 최댓값이 bigger의 최솟값보다 크다면, 그 값을 서로 바꿔야 한다.
if (!smaller.empty() && !bigger.empty() && smaller.top() > bigger.top())
{
// smaller는 최대 힙이므로 최댓값이 top에 위치한다.
int small_top = smaller.top();
smaller.pop();
// bigger는 최소 힙이므로 최솟값이 top에 위치한다.
int big_top = bigger.top();
bigger.pop();
smaller.push(big_top);
bigger.push(small_top);
}
cout << smaller.top() << '\n';
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 2109: 순회강연 (1) | 2024.03.04 |
---|---|
[백준][C++] 1766: 문제집 (2) | 2024.03.01 |
[백준][C++] 19598: 최소 회의실 개수 (0) | 2024.02.27 |
[백준][C++] 4964: 섬의 개수 (1) | 2024.02.26 |
[백준][C++] 15903: 카드 합체 놀이 (0) | 2024.02.22 |