๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

๋ฐฑ์ค€ - [BOJ 2109] ์ˆœํšŒ๊ฐ•์—ฐ

by ๐Ÿณ Laboon 2024. 2. 29.

๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ ธ์ง€(BOJ)์—์„œ ์ œ๊ณต ๋˜๋Š” 2019๋ฒˆ ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋””(Greedy, ํƒ์š•๋ฒ•) ์œ ํ˜•์ด๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” code.plus ์ค‘๊ธ‰ 1/3, ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ฒŒ์‹œ๋œ ๋ฌธ์ œ์ด๋‹ค.


๋ฌธ์ œ

ํ•œ ์ €๋ช…ํ•œ ํ•™์ž์—๊ฒŒ n(0 ≤ n ≤ 10,000)๊ฐœ์˜ ๋Œ€ํ•™์—์„œ ๊ฐ•์—ฐ ์š”์ฒญ์„ ํ•ด ์™”๋‹ค. ๊ฐ ๋Œ€ํ•™์—์„œ๋Š” d(1 ≤ d ≤ 10,000)์ผ ์•ˆ์— ์™€์„œ ๊ฐ•์—ฐ์„ ํ•ด ์ฃผ๋ฉด p(1 ≤ p ≤ 10,000)๋งŒํผ์˜ ๊ฐ•์—ฐ๋ฃŒ๋ฅผ ์ง€๋ถˆํ•˜๊ฒ ๋‹ค๊ณ  ์•Œ๋ ค์™”๋‹ค. ๊ฐ ๋Œ€ํ•™์—์„œ ์ œ์‹œํ•˜๋Š” d์™€ p๊ฐ’์€ ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ํ•™์ž๋Š” ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ๊ฐ€์žฅ ๋งŽ์€ ๋ˆ์„ ๋ฒŒ ์ˆ˜ ์žˆ๋„๋ก ์ˆœํšŒ๊ฐ•์—ฐ์„ ํ•˜๋ ค ํ•œ๋‹ค. ๊ฐ•์—ฐ์˜ ํŠน์„ฑ์ƒ, ์ด ํ•™์ž๋Š” ํ•˜๋ฃจ์— ์ตœ๋Œ€ ํ•œ ๊ณณ์—์„œ๋งŒ ๊ฐ•์—ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋„ค ๋Œ€ํ•™์—์„œ ์ œ์‹œํ•œ p๊ฐ’์ด ๊ฐ๊ฐ 50, 10, 20, 30์ด๊ณ , d๊ฐ’์ด ์ฐจ๋ก€๋กœ 2, 1, 2, 1 ์ด๋ผ๊ณ  ํ•˜์ž. ์ด๋Ÿด ๋•Œ์—๋Š” ์ฒซ์งธ ๋‚ ์— 4๋ฒˆ ๋Œ€ํ•™์—์„œ ๊ฐ•์—ฐ์„ ํ•˜๊ณ , ๋‘˜์งธ ๋‚ ์— 1๋ฒˆ ๋Œ€ํ•™์—์„œ ๊ฐ•์—ฐ์„ ํ•˜๋ฉด 80๋งŒํผ์˜ ๋ˆ์„ ๋ฒŒ ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๋Œ€ํ•™์—์„œ ์ œ์‹œํ•œ p๊ฐ’๊ณผ d๊ฐ’์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

 

์ฒซ์งธ ์ค„์— ์ตœ๋Œ€๋กœ ๋ฒŒ ์ˆ˜ ์žˆ๋Š” ๋ˆ์„ ์ถœ๋ ฅํ•œ๋‹ค.


ํ’€์ด

๊ทธ๋ฆฌ๋”” ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋‹ต์„ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค.

๊ทธ๋ฆฌ๋”” ์œ ํ˜•์ธ ๊ฒƒ์„ ์•Œ๊ธฐ ์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ์ •๋ณด๋กœ ํ•ด๊ฒฐ๋ฒ•์„ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์ž.

 

1. ํ•™์ž๋Š” n๊ฐœ์˜ ๊ฐ•์—ฐ ์š”์ฒญ์„ ๋ฐ›์•˜๋‹ค.

2. ๊ฐ•์—ฐ ์ค‘ d์ผ ์•ˆ์— ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•์—ฐ์„ ์„ ํƒํ•ด์•ผํ•œ๋‹ค.

3. 2๋ฒˆ ์ค‘ p๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฐ•์—ฐ์„ ์„ ํƒํ•œ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ํ’€์ด๋ฅผ ์ •๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด 0 <= n <= 10,000, 1 <= d <= 10,000, 1 <= p <= 10,000 ์ด๋ผ๋Š” ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋ฃจ์— ์ตœ๋Œ€ ํ•œ ๊ณณ์—์„œ๋งŒ ๊ฐ•์—ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ๊ฑด์ด ์กด์žฌํ•œ๋‹ค.

 

์ œํ•œ์‹œ๊ฐ„์€ 2์ดˆ์ด๋ฏ€๋กœ n๊ฐœ์˜ (d, p)์— ๋Œ€ํ•ด ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด๋„ ์‹œ๊ฐ„ ๋‚ด์— ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ‘๊ทผ

 

๋‚˜๋Š” ์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด์„œ d์ผ ์ผ ๋•Œ ๊ฐ€์žฅ ํฐ p๋ฅผ ์„ ํƒํ•˜๋Š” ํ’€์ด๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ์„ ํƒ์„ ํ•œ๋‹ค๋ฉด 2์ผ ์•ˆ์— ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•์—ฐ ์ค‘ pay๊ฐ€ 20๊ณผ 30์„ ์ฃผ๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” 1์ผ์ฐจ ๊ฐ•์—ฐ์„ ๊ผญ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” d์ผ ์•ˆ์— ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•์—ฐ์„ ์„ ํƒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ ์ค‘์—์„œ๋„ pay๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฐ•์—ฐ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋งจ ๋งˆ์ง€๋ง‰ ๊ฐ•์—ฐ๋‚ ์งœ๋ถ€ํ„ฐ ์ ‘๊ทผํ•˜๋ฉด ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

n = 9

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด n = 9์ผ ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. 

์šฐ๋ฆฌ๋Š” ๊ฐ•์—ฐ์ด ์ตœ๋Œ€ 10000์ผ๊นŒ์ง€๋ผ๋Š” ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿผ day๊ฐ€ 4์ผ์ด ๋  ๋•Œ๊นŒ์ง€ ์•„๋ฌด๋Ÿฐ ์กฐ์น˜๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

day๊ฐ€ 4์ผ์ด ๋˜์—ˆ์„ ๋•Œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

1. 20, 30, 30 ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ณ ๋ฅธ๋‹ค. (30)

2. ํ•ด๋‹น ๊ฐ•์—ฐ์„ 4์ผ ๋•Œ ์ง„ํ–‰ํ•œ๋‹ค.

day๊ฐ€ 3์ผ์ด ๋˜์—ˆ์„ ๋•Œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

1. 30, 40, 50, 20, 30 ์ค‘์— ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ณ ๋ฅธ๋‹ค. (50)

-> day 4๊นŒ์ง€์˜ ๊ฐ•์—ฐ๋“ค์€ 4์ผ ๋‚ด์— ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— 3์ผ๊ณผ 4์ผ์„ ํฌํ•จํ•ด์„œ ์„ ํƒํ•œ๋‹ค.

2. ํ•ด๋‹น ๊ฐ•์—ฐ์„ 3์ผ์ฐจ์— ์ง„ํ–‰ํ•œ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์ด๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Brute-Force
๋”๋ณด๊ธฐ
/*
	dev-dot.tistory.com
	code.plus
	acmicpc 2109
*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<pair<int, int>> input(int &n) {
	vector<pair<int, int>> v;
	int p, d;
	
	cin >> n;
	for(int i = 0; i < n; i++) {
		cin >> p >> d;
		v.push_back(make_pair(d, p));
	}
	
	return v;
}

int solve(vector<pair<int, int>> v) {
	int size = v.size();
	int totalPay = 0;
	vector<bool> visited(10001);
	
	for(int day = 10000; day > 0; day--) {
		int maxPay = 0;
		int lectIdx = -1;
		for(int lect = 0; lect < size; lect++) {
			// ๋ฐฉ๋ฌธํ•  ์˜ˆ์ • ๋‚ ์งœ๊ฐ€ ์ง€๋‚ฌ์œผ๋ฉด ๋ฌด์‹œ 
			if(v[lect].first < day) continue;
			// ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด ๋ฌด์‹œ 
			if(visited[lect]) continue;
			// ์˜ค๋Š˜ ๋‚ ์งœ ์ค‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ํŽ˜์ด ์„ ํƒ 
			if(maxPay < v[lect].second) {
				maxPay = v[lect].second;
				lectIdx = lect;
			}
		}
		if (lectIdx != -1) {
			totalPay += maxPay;
			visited[lectIdx] = true;
		}
	}
	
	return totalPay;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);
	
	int n;
	vector<pair<int, int>> v = input(n);
	cout << solve(v);
	
	return 0;
}

์œ„์™€๊ฐ™์ด ๋ชจ๋“  ๋‚ ์งœ(d)์— ๋Œ€ํ•ด ํ•ด๋‹น ๊ฐ•์—ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ Brute-Force๋ผ๊ณ  ํ•œ๋‹ค.

 

ํšจ์œจ์ ์ธ ํ’€์ด

 

๋ชจ๋“  ๋ฐฉ์‹์„ ํƒ์ƒ‰ํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ํšจ์œจ์ ์ธ ํ’€์ด๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ๋‹ค.

 

์ด์ „ ํ’€์ด์—์„œ ์‹œ๊ฐ„ํšจ์œจ์„ฑ์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. ์ •๋ ฌ์ด ๋˜์–ด์žˆ์ง€ ์•Š์•„์„œ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ 

2. ์ •๋ ฌ์„ ํ•˜๋”๋ผ๋„ d์ผ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ p๋ฅผ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค ๋˜ ์ •๋ ฌ์„ ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ 

 

์šฐ๋ฆฌ๋Š” ์ •๋ ฌ์„ ํ•œ๋‹ค๋ฉด x์ผ๋ถ€ํ„ฐ 10000์ผ๊นŒ์ง€๋งŒ ํƒ์ƒ‰์„ ํ•˜๋ฉด ๋œ๋‹ค.

์ •๋ ฌ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 1์ผ๋ถ€ํ„ฐ 10000์ผ๊นŒ์ง€ ๋ชจ๋‘ ํƒ์ƒ‰์„ ํ•ด์•ผํ•œ๋‹ค.

 

๊ทธ๋ ‡์ง€๋งŒ ์œ„ ํ’€์ด์—์„œ d์ผ ~ d_max์ผ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ์ •๋ ฌํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด N^2 log N์ด๋ผ๋Š” ๋” ๋น„ํšจ์œจ์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

heap ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. (ํฌ์ŠคํŠธ ์ž‘์„ฑ์ผ ๊ธฐ์ค€ ์•„์ง ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•จ.)

 

heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ Priority_queue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๋ฌธ์ œ์ ์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์žฅ ํฐ data๋Š” ํ•ญ์ƒ queue์˜ front์— ์กด์žฌํ•˜๋ฏ€๋กœ ์ด ์ ์„ ์ด์šฉํ•˜๋ฉด ์ด NlogN์˜ ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

priority_queue
/*
	authored by jihwankim
	dev-dot.tistory.com
	code.plus
*/
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

priority_queue<pair<int, int>> input(int &n) {
	priority_queue<pair<int, int>> pq;
	int p, d;
	
	cin >> n;
	for(int i = 0; i < n; i++) {
		cin >> p >> d;
		pq.push(make_pair(-d, p));
	}
	
	return pq;
}

int solve(priority_queue<pair<int, int>> &pq) {
	priority_queue<int> allPay;
	int day, pay;
	int today = 1;
	
   	// 1์ผ๋ถ€ํ„ฐ d_max๊นŒ์ง€ ๊ฐ•์—ฐ์„ ํƒ์ƒ‰
	while(!pq.empty()) {
		day = -pq.top().first;
		pay = pq.top().second;
		pq.pop();
		
        // ๊ฐ€์žฅ pay๊ฐ€ ๋†’์€ ๊ฐ•์—ฐ์˜ ์œ ํšจ์ผ์ž๊ฐ€ ์ง€๋‚ฌ์„ ๊ฒฝ์šฐ
		if(day < today) {
        	// ํ˜„์žฌ๊นŒ์ง€ ์„ ํƒํ•œ ๊ฐ•์—ฐ ์ค‘ ํ˜„์žฌ pay๋ณด๋‹ค ์ ์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๊ต์ฒด
			if(-allPay.top() < pay) {
				allPay.pop();
				allPay.push(-pay);
			}
			continue;
		}
		
		allPay.push(-pay);
		today++;
	}
	
	int totalPay = 0;
	// ๋ชจ๋“  pay์— ๋Œ€ํ•ด ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐ
    while(!allPay.empty()) {
		totalPay += (-allPay.top());
		allPay.pop();
	}
	
	return totalPay;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);
	
	int n;
	priority_queue<pair<int, int>> pq = input(n);
	cout << solve(pq);
	
	return 0;
}

 

๋‹ค๋งŒ ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์•ž์—์„œ ์ ‘๊ทผํ–ˆ๋‹ค.

๋’ค์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋ฏ€๋กœ ์Šค์Šค๋กœ ์ฐพ์•„๋ณด๋ฉด ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค.


ํ•ด๊ฒฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•

 

์ •๋ ฌ์„ ์ด์šฉํ•ด๋ณด๊ธฐ

brute-force ํ’€์ด์—์„œ heap์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์–ด๋ณด๊ธฐ

 

์ฐธ๊ณ ํ•  ํฌ์ŠคํŠธ

 

์•„์ง ๋ฏธ์ž‘์„ฑ

๋ฌธ์ œ

 

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

 

2109๋ฒˆ: ์ˆœํšŒ๊ฐ•์—ฐ

ํ•œ ์ €๋ช…ํ•œ ํ•™์ž์—๊ฒŒ n(0 ≤ n ≤ 10,000)๊ฐœ์˜ ๋Œ€ํ•™์—์„œ ๊ฐ•์—ฐ ์š”์ฒญ์„ ํ•ด ์™”๋‹ค. ๊ฐ ๋Œ€ํ•™์—์„œ๋Š” d(1 ≤ d ≤ 10,000)์ผ ์•ˆ์— ์™€์„œ ๊ฐ•์—ฐ์„ ํ•ด ์ฃผ๋ฉด p(1 ≤ p ≤ 10,000)๋งŒํผ์˜ ๊ฐ•์—ฐ๋ฃŒ๋ฅผ ์ง€๋ถˆํ•˜๊ฒ ๋‹ค๊ณ  ์•Œ๋ ค์™”๋‹ค.

www.acmicpc.net

https://code.plus/course/43

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘๊ธ‰ 1/3

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘๊ธ‰

code.plus