Koder / 박성훈
article thumbnail

우선순위큐를 죽어라 바이럴하는 문제

우선순위 큐(특히 STL의 그것) 에 대해 알고있다면 쉽게 해결할 수 있는 문제였다.

https://www.acmicpc.net/problem/14235

 

14235번: 크리스마스 선물

크리스마스에는 산타가 착한 아이들에게 선물을 나눠준다. 올해도 산타는 선물을 나눠주기 위해 많은 노력을 하고 있는데, 전세계를 돌아댕기며 착한 아이들에게 선물을 나눠줄 것이다. 하지만

www.acmicpc.net

아이들이 요구할때마다 가장 가치가 큰 물건을 꺼내야 하기 때문에,

우선순위 큐를 통해서 우선순위(가치) 가 높은 숫자를 꺼내서 하나씩 출력해주면 된다.

 

굳이 우선순위 큐 아니더라도 중복 감안할수 있는 멀티셋 같은거 활용해도 되지 않나 싶기도 하고

아마 그냥 반복문으로도 해결을 할 수 있지 않을까 싶다.

정렬조차 안하는 기본적인 반복문으로도 문제 해결이 가능해서

아마 티어 내려야하지 싶다....

 

PQ를 사용한 풀이.

#include <bits/stdc++.h>
using namespace std;

priority_queue<int> pq;

int main(){
	int N,K,a;
	
	cin >> N;
	while(N--){
		cin >> K;
		if(!K){
			if(!pq.empty()){
				cout << pq.top() << "\n";
				pq.pop();
			}
			else{
				cout << -1 << "\n";
			}
		}
		else{
			for(int i=0; i<K; i++){
				cin >> a;
				pq.push(a);
			}
		}
	}
	return 0;
}

 

반복문을 사용한 풀이

#include <bits/stdc++.h>
using namespace std;

vector<int> v;

int main(){
	int N,K,a;
	
	cin >> N;
	while(N--){
		cin >> K;
		if(!K){
			int mx = -1;
			int mxptr = 0;
			for(int i=0; i<v.size(); i++){
				if(mx < v[i]){
					mx = v[i];
					mxptr = i;
				}
			}
			
			if(mx != -1){
				cout << mx << "\n";
				v[mxptr] = -1;
			}
			else{
				cout << -1 << "\n";
			}
		}
		else{
			for(int i=0; i<K; i++){
				cin >> a;
				v.push_back(a);
			}
		}
	}
	return 0;
}

반응형