레야몬
[C++] 1202번 보석 도둑 - 그리디, 정렬, 우선순위 큐 본문
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#define MAX_BAG 300001
#define LOOP(i, n) for(int i=1; i<=n; i++)
using namespace std;
typedef long long int lld;
int N, K; //보석 개수 N, 가방 개수 K
int b_wei[MAX_BAG]; //가방에 담을 수 있는 최대 무게. bag_weight
vector<pair<int, int>> jew; //보석의 정보 M, V
lld sum; //보석 가격의 합
priority_queue<int> pq;
void input()
{
cin >> N >> K;
LOOP(i, N) {
int M, V;
cin >> M >> V;
jew.push_back({M, V});
}
LOOP(i, K) cin >> b_wei[i];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
input();
sort(b_wei+1, b_wei+K+1); //가방 오름차순 정렬
sort(jew.begin(), jew.end()); //보석의 무게로 오름차순 정렬
int id=0;
LOOP(i, K) {
int C = b_wei[i];
for(; id<N && jew[id].first<=C; id++)
pq.push(jew[id].second);
if(!pq.empty()) {
sum+=pq.top(); pq.pop();
}
}
cout << sum;
return 0;
}
솔직히 말해서 많이 어려웠다. 아마 그리디 알고리즘은 많이 접해보지 않아서 그런 것 같다. 그래도 그리디 알고리즘은 엄청 중요한 알고리즘이라서 공부해야하기는 한데... 시간을 두고 천천히 가보려고 한다.
우선순위 큐의 사용법을 알게 된 것 같다. 우선순위 큐는 sort를 항시 유지하기 어려울 때 사용하는 것 같다. 우선순위 큐를 사용하는 것만으로 자동으로 sort를 해주니까.
내 코드가 다른 사람 코드랑 똑같으면서도 8ms느린데 아마 매크로를 많이 써서 그렇지 않은가 싶다.
<우선순위 큐>
https://8156217.tistory.com/11
[C++] Priority Queue & Pair 사용법
Priortity Queue와 Pair를 함께 사용하면 어떤 기능을 할 수 있는지 알아보자. ① 기본적인 사용 첫 번째 인자 기준으로 내림차순 정렬, 같다면 두 번째 인자를 기준으로 내림차순 정렬. priori
8156217.tistory.com
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 1806번 부분합 - 두 포인터 (0) | 2022.09.21 |
---|---|
[C++] 1208번 부분수열의 합 2 - 중간에서 만나기 (0) | 2022.09.21 |
[C++] 1005번 ACM Craft - DP, 위상 정렬, DFS (0) | 2022.09.20 |
[C++] 1197번 최소 스패닝 트리 - 최소 스패닝 트리, Union-Find (2) | 2022.09.07 |
[C++] 15654번 N과 M (5) - 백트래킹 (0) | 2022.09.06 |
Comments