📕알고리즘 문제/📝Baekjoon

[백준] 골드2 : (1202) 보석 도둑

주으기 2025. 2. 18. 17:16
728x90
반응형

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

 

가방은 오름차순으로 정렬한다.

가장 가벼운 가방으로 들 수 있는 보석들은 이후 모든 가방으로도 들 수 있기 때문이다.

 

보석은 무게를 기준으로 오름차순으로 정렬하되, 무게가 같은 경우, 가격순으로 내림차순으로 정렬한다.

훔칠 수 있는 보석 가격의 합의 최댓값을 구해야 하기 때문이다.

 

가방을 모두 순회하며 해당 가방의 무게로 들 수 있는 보석들을 우선순위 큐에 저장한다.

우선순위 큐는 무게와 상관없이 가격순으로 내림차순 정렬이 되도록 한다.

 

현재 가방 무게로 가장 비싼 보석을 더하고, 큐에서 제거한다.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

bool Cmp(const pair<int, int>& a, const pair<int, int>& b)
{
	if (a.first == b.first) return a.second > b.second;
	return a.first < b.first;
}

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

	int N, K;
	long long Answer = 0;
	cin >> N >> K;

	vector<pair<int, int>> Jewel(N);
	vector<int> Bag(K);

	for (int i = 0; i < N; ++i)
		cin >> Jewel[i].first >> Jewel[i].second;

	for (int i = 0; i < K; ++i)
		cin >> Bag[i];

	// 보석 무게 오름차순 정렬, 같은 무게면 가격순으로 내림차순 정렬
	sort(Jewel.begin(), Jewel.end(), Cmp);

	// 가방 무게 오름차순 정렬
	sort(Bag.begin(), Bag.end());
	
	// 현재 남은 가방 무게로 들 수 있는 보석들 / 가격순으로 내림차순 정렬
	priority_queue<int> SaveJewel;

	int Index = 0;
	for (int i = 0; i < K; ++i)
	{
		int Cur = Bag[i];

		// 현재 가방 무게로 들 수 있는 모든 보석을 저장
		// 가방 무게를 오름차순으로 정렬했기 때문에, 이전 가방으로 들 수 있는 보석은 이후 모든 가방에서도 들 수 있다.
		for (Index; Index < N; ++Index)
		{
			if (Jewel[Index].first <= Cur) SaveJewel.push(Jewel[Index].second);
			else break;
		}

		// 현재 가방 무게로 들 수 있는 보석들 중, 가장 비싼 보석 가져옴
		if (!SaveJewel.empty()) Answer += SaveJewel.top(), SaveJewel.pop();
	}

	cout << Answer << "\n";
}

 

 

 

 

 

728x90
반응형