mojo's Blog

[백준 1655] 가운데를 말해요 본문

백준/Stack, Queue

[백준 1655] 가운데를 말해요

_mojo_ 2021. 8. 5. 18:21

문제 링크 => 1655번: 가운데를 말해요 (acmicpc.net)

 

1655번: 가운데를 말해요

첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1

www.acmicpc.net


최소힙, 최대힙을 이용하는 문제이다.

 

우선순위 큐를 이용하여 maxHeap, minHeap를 만들고 최소힙, 최대힙의 합한 갯수, 즉, 받아온 데이터의 갯수가 홀수일때와 짝수일때를 고려해줘야 한다.

 

데이터의 갯수(2n+1)가 홀수일 때 => 최대힙의 갯수 n+1 개, 최소힙의 갯수 n 개에 대하여 최대힙의 최댓값, 최소힙의 최솟값을 비교하여 더 작은 결과가 중간값이다. 

 

데이터의 갯수(2n)가 짝수일 때 => 최대힙, 최소힙의 갯수는 n 개로 동일하며 이 경우 또한 최대힙의 최댓값, 최소힙의 최솟값을 비교하여 더 작은 결과가 중간값이다.

 

이때 주의할 점은, 최대힙에서 최댓값을 최소힙에 넣고 최소힙에서 최솟값을 최대힙에 넣는 과정을 반드시 해주는 것이 필수다.

 

풀이 code

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define INF 100000000
#define endl '\n'
#define ll long long

using namespace std;

void solve() {
	
	priority_queue<int> maxHeap, minHeap;

	int n;
	cin >> n;

	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		maxHeap.push(x);

		if (i == 1) {
			cout << x << endl;
		}
		else if (i == 2) {
			minHeap.push(-maxHeap.top());
			maxHeap.pop();
	
			int x = maxHeap.top(), y = -minHeap.top();
			cout << (x < y ? x : y) << endl;
		}
		else {
			if (i % 2) {
				minHeap.push(-maxHeap.top());
				maxHeap.pop();
				maxHeap.push(-minHeap.top());
				minHeap.pop();
				int x = maxHeap.top(), y = -minHeap.top();
				cout << (x < y ? x : y) << endl;
			}
			else {
				minHeap.push(-maxHeap.top());
				maxHeap.pop();
				maxHeap.push(-minHeap.top());
				minHeap.pop();
				minHeap.push(-maxHeap.top());
				maxHeap.pop();
				int x = maxHeap.top(), y = -minHeap.top();
				cout << (x < y ? x : y) << endl;
			}
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	solve();
	
	return 0;
}

'백준 > Stack, Queue' 카테고리의 다른 글

[백준 11003] 최솟값 찾기  (0) 2021.07.10
[백준 2504] 괄호의 값  (0) 2021.07.01
[백준 5397] 키로거  (0) 2021.07.01
Comments