중앙값

less than 1 minute read

중앙값 구하기

c++ 백준 문제 푸는 겸 만든 중앙값을 구하기 위한 큐

#include <iostream>
#include <vector>
#include <queue>

class MedianQueue{
private:
	std::priority_queue<int> smallerQueue; // 중앙값보다 작은 값들을 보관하는곳(중앙값도 여기에 보관)
	std::priority_queue<int, std::vector<int>, std::greater<int>> biggerQueue;
	// 중앙값보다 큰 값을 보관하는 곳, 기본적으로 큰값이 먼저 나오기 때문에 반대로 나오도록 설정
	//smallerQueue가 biggerQueue보다 개수가 1개 많도록 유지한다.
public:
	void push(int value);
	void pop();
	double top();
};

void MedianQueue::push(int value){
	if(smallerQueue.size() == 0){ // smallerQueue는 기준이 저장 될 것이기 때문에 최소 biggerQueue보다 개수가 1개 많거나 같아야한다.
		smallerQueue.push(value);
	}
	else if(smallerQueue.top() > value){ // 기준점보다 작으면 smallerQueue에 보관
		smallerQueue.push(value);
	}
	else { // 기준점보다 크면 biggerQueue에 보관
		biggerQueue.push(value);
	}
	
	if(smallerQueue.size() < biggerQueue.size()){ // smallerQueue이 biggerQueue보다 개수가 1개 많거나 같도록 조정
		smallerQueue.push(biggerQueue.top());
		biggerQueue.pop();
	}
	else if(smallerQueue.size() - 1 > biggerQueue.size()){
		biggerQueue.push(smallerQueue.top());
		smallerQueue.pop();
	}
}

double MedianQueue::top(){
	if(smallerQueue.size() == biggerQueue.size()){ // 입력된 값의 개수가 짝수일경우 두 큐의 값의 평균을 반환 
		return (double)(smallerQueue.top() + biggerQueue.top() ) / 2;
	}
	else {
		return smallerQueue.top();
	}
}

void MedianQueue::pop(){ // 짝수일 경우 가운데 2개의 값을 제거, 홀수 일 경우 중앙값만 제거
	if (smallerQueue.size() == biggerQueue.size()) {
		smallerQueue.pop();
		biggerQueue.pop();
	}
	else {
		smallerQueue.pop();
	}
}