백준이는 동생에게 "가운데를 말해요" 게임을 가르쳐주고 있다. 백준이가 정수를 하나씩 외칠때마다 동생은 지금까지 백준이가 말한 수 중에서 중간값을 말해야 한다. 만약, 그동안 백준이가 외친 수의 개수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말해야 한다.
예를 들어 백준이가 동생에게 1, 5, 2, 10, -99, 7, 5를 순서대로 외쳤다고 하면, 동생은 1, 1, 2, 2, 2, 2, 5를 차례대로 말해야 한다. 백준이가 외치는 수가 주어졌을 때, 동생이 말해야 하는 수를 구하는 프로그램을 작성하시오.
자료 구조
우선순위 큐
이전 [C++] 백준 2696: 중앙값 구하기을 참고하였다. 2696번 문제와 모두 동일한데, 갯수가 짝수일 경우의 중앙값 판단만 생각해주면 된다.
코드는 대체로 비슷하고, 조건문만 조금 수정해주었다. q1
과 q2
의 사이즈가 같을 때에도 반드시 q2
에 알맞은 값을 삽입해주는 로직으로 바꾸면 된다.
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
int t, n, in, root;
priority_queue<int> q1;
priority_queue<int, vector<int>, greater<>> q2;
vector<int> res;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &in);
if (i == 0)
root = in;
else {
if (q1.size() < q2.size()) {
if (q2.top() < in) {
q1.push(root);
root = q2.top();
q2.pop();
q2.push(in);
}
else if (root < in) {
q1.push(root);
root = in;
}
else q1.push(in);
}
else {
if (!q1.empty()) {
if (q1.top() > in) {
q2.push(root);
root = q1.top();
q1.pop();
q1.push(in);
}
else if (root > in) {
q2.push(root);
root = in;
}
else q2.push(in);
}
else {
if (root < in) q2.push(in);
else {
q2.push(root);
root = in;
}
}
}
}
printf("%d\n", root);
}
return 0;
}