Information Security ˗ˋˏ ♡ ˎˊ˗

Programming/Programming 풀이

[Baekjoon] 1202번 보석도둑(C++)

토오쓰 2021. 1. 7. 22:54

www.acmicpc.net/problem/1202

 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net

 

Level: Level 2

풀이: 기존풀이 참고

Language: C++

 

 

문제설명

세계적인 도둑 상덕이는 보석점을 털기로 결심했다.

상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.

상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.

 

 

입력/출력

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000)

다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000)

다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci ≤ 100,000,000)

모든 숫자는 양의 정수이다.

입력 예

3 2 1 65 5 23 2 99 10 2

 

출력

첫째 줄에 상덕이가 훔칠 수 있는 보석 가격의 합의 최댓값을 출력한다.

출력 예

164

힌트 ⇒ 첫 번째 보석을 두 번째 가방에, 세 번째 보석을 첫 번째 가방에 넣으면 된다.

 

 

풀이

가격이 높은 보석도 중요하지만, 그 보석 무게 이상인 값 중에서 가장 작은 값을 갖는 가방을 선택해야 가격이 높은 보석을 많이 훔칠 수 있다.

우선순위 큐를 이용하여 문제를 해결하였다.

 

 

Code

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

int N, K;
int bag[300000];
pair<int, int> jew[300000];
priority_queue<int> q; //우선순위 큐 사용

int main(void){
	//보석의 개수 N, 가방의 개수 K
	cin >> N >> K;
	//N개 만큼 보석의 정보 입력 받음
	for (int i = 0; i < N; i++)
		cin >> jew[i].first >> jew[i].second;
	//K개 만큼 가방의 최대 무게 입력 받음
	for (int i = 0; i < K; i++)
		cin >> bag[i];

	//무게를 기준으로 보석과 가방 오름차순 정렬
	sort(jew, jew + N);
	sort(bag, bag + K);

	long long result = 0;
	int idx = 0;
	//무게제한이 낮은 가방부터 최대한 비싼 보석을 넣는 방법
	for (int i = 0; i < K; i++)
	{
		//i번째 가방의 무게제한에 충족하는 보석 다 넣음
		while (idx < N && jew[idx].first <= bag[i])
			q.push(jew[idx++].second);
		//q 가장 처음에는 현재 기준 제일 비싼 보석이 들어있음
		if (!q.empty()) {
			result += q.top();
			q.pop();
		}
	}
	cout << result << "\n";
}

 

 

ScreenShot

 

 

참고

https://jaimemin.tistory.com/760

 

백준 1202번 보석 도둑

문제 링크입니다: https://www.acmicpc.net/problem/1202 그리디(Greedy) 알고리즘에 우선순위 큐(Priority Queue) 자료구조를 사용해야 했던 문제였습니다. 우선순위 큐 자료구조를 사용하는 부분은 종신1재정2.

jaimemin.tistory.com