백준 알고리즘
[백준 문제풀이] 1202 c++ 보석도둑
mindun
2025. 2. 13. 11:21
반응형

정렬을 활용하여 그리디 하게 풀 수 있는 문제.
1. 보석과 가방을 무게를 기준으로 오름차순 정렬
- 보편적인 그리디+정렬 문제는 무게를 기준으로 내림차순 정렬하여 가방을 채워나갈 수 있지만,
이 문제에서는 최적의 값을 찾지 못한다.
가장 낮은 무게의 가방을 기준으로 가장 높은 가치의 보석을 담는 것이 핵심
2. 우선순위 큐 자료구조를 활용하여 제한된 크기의 가방에 넣을 수 있는 무게의 보석을 다 담는다
담은 후 우선순위 큐가 가장 큰 값을 top에 위치할 것이므로 그 값을 i 번째 가방의 값으로 지정한다.
i+1 가방의 값도 마찬가지로 정할 수 있다. i 번째 가방에서 우선순위 큐에 넣었던 값들과 비교하여
제한된 무게에 들어가는 가장 큰 값을 구할 수 있다.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int n, k;
std::cin >> n >> k;
std::vector<std::pair<int, int>> gem(n, {0,0});
std::vector<int> bag(k, 0);
int a, b;
for (int i{ 0 }; i < n; i++) {
std::cin >> a >> b;
gem[i].first = a;
gem[i].second = b;
}
for (int i{ 0 }; i < k; i++) {
std::cin >> bag[i];
}
std::sort(gem.begin(), gem.end());
std::sort(bag.begin(), bag.end());
int j = 0, i = 0;
long long ans = 0;
std::priority_queue<int> q;
for (int i{ 0 };i<k;i++) {
while (j < n && bag[i] >= gem[j].first) {
q.push(gem[j++].second);
}
if (!q.empty()) {
ans += q.top();
q.pop();
}
}
std::cout << ans << "\n";
}반응형