๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][BOJ] 2109 ์ˆœํšŒ๊ฐ•์—ฐ :: ๊ทธ๋ฆฌ๋””(Greedy)

ibelieveinme 2024. 5. 14. 23:45
728x90

 

[๋ฌธ์ œ]

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

 

d(1 ≤ d ≤ 10,000)์ผ ์•ˆ์— ์™€์„œ ๊ฐ•์—ฐ์„ ํ•ด ์ฃผ๋ฉด p(1 ≤ p ≤ 10,000)๋งŒํผ์˜ ๊ฐ•์—ฐ๋ฃŒ๋ฅผ ์ง€๋ถˆํ•œ๋‹ค.

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

๊ฐ€์žฅ ๋งŽ์€ ๋ˆ์„ ๋ฒŒ ์ˆ˜ ์žˆ๋Š” ์ˆœํšŒ๊ฐ•์—ฐ์„ ์ฐพ๊ณ  ๊ทธ ๋ˆ์„ ์ถœ๋ ฅํ•˜๋ผ.

 

 

[ํ’€์ด]

d ์ผ ์•ˆ์— ์™€์„œ ๊ฐ•์—ฐ์ด๋ผ๋Š” ์กฐ๊ฑด์„ d ์ผ์— ๊ฐ•์—ฐํ•˜๋Š” ๊ฑธ๋กœ ์ž˜๋ชป ์ดํ•ดํ•˜์—ฌ map ์œผ๋กœ ํ’€๋‹ค๊ฐ€ ํ‹€๋ ธ๋‹ค.

๊ฒŒ์‹œํŒ์„ ์ฐธ๊ณ ํ•ด๋ณด๋‹ˆ d ์ผ ์•ˆ์— ์™€์„œ ๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ์— d ์ผ ์•ˆ์ด๋ฉด ์–ธ์ œ๋“  ๊ฐ•์—ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

 

n๊ฐœ์˜ ๋Œ€ํ•™์˜ ์ „๋ถ€๋ฅผ ๋น„๊ตํ•˜๊ธฐ์—๋Š” ์‹œ๊ฐ„์ œํ•œ์ด ๋˜๋ฏ€๋กœ sort, priority queue ๋ฅผ ์ด์šฉํ•œ Greedy  ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

๊ธฐํ•œ์„ ๊ธฐ์ค€์œผ๋กœ ํ• ๊ฑด์ง€ ๊ฐ•์—ฐ๋ฃŒ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•  ๊ฑด์ง€ ์ •๋ ฌ ๊ธฐ์ค€์„ ์„ธ์›Œ์•ผ ํ•œ๋‹ค.

 

์†์œผ๋กœ ๊ทธ๋ ค๊ฐ€๋ฉฐ ๊ธฐํ•œ ์˜ค๋ฆ„์ฐจ์ˆœ/๋‚ด๋ฆผ์ฐจ์ˆœ, ๊ฐ•์—ฐ๋ฃŒ ์˜ค๋ฆ„์ฐจ์ˆœ/๋‚ด๋ฆผ์ฐจ์ˆœ ์„ ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์•˜์„ ๋•Œ,

๊ธฐํ•œ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ์˜ค๋ฆ„์ฐจ์ˆœ priority_queue๋กœ queue ์˜ ํฌ๊ธฐ > ๋น„์šฉ๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์ตœ์†Œ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’๋งŒ ๋‚จ๊ธฐ๋ฉด ํ’€๋ฆฐ๋‹ค.

 

 

[ํ’€์ด ์˜ˆ์‹œ]

5

3 3

2 3

1 3

100 4

90 4

 

1) ๋จผ์ € ์ผ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ธฐ

d p

3 1

3 2

3 3

4 90

4 100

 

2) priority queue ์— ๋„ฃ๊ณ  priority queue ํฌ๊ธฐ๋ณด๋‹ค ์ผ์ž๊ฐ€ ๋„˜์ง€ ์•Š๋Š”์ง€ ๋น„๊ตํ•œ๋‹ค.

priority queue ํฌ๊ธฐ ์ž์ฒด๊ฐ€ ๊ธฐํ•œ์ด ๋˜๋ฉฐ (1๊ฐœ ๋„ฃ์œผ๋ฉด 1์ผ์ฐจ ์ด๋‚ด, 2๊ฐœ ๋„ฃ์œผ๋ฉด 2์ผ์ฐจ ์ด๋‚ด ๋“ฑ)

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜๊ธฐ์— ๋งจ ์œ„ ๋ฃจํŠธ๊ฐ’์— ์ตœ์†Œ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

 

i = 0

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜๋Š” priority queue ์— 1์„ ๋„ฃ๋Š”๋‹ค. priority queue size (1) < ๊ธฐํ•œ(3)

 

i = 1

priority queue ์— 2๋ฅผ ๋„ฃ๋Š”๋‹ค. priority queue size (2) < ๊ธฐํ•œ(3)

 

i = 2

priority queue ์— 3๋ฅผ ๋„ฃ๋Š”๋‹ค. priority queue size (3) == ๊ธฐํ•œ(3)

 

i = 3

priority queue ์— 90๋ฅผ ๋„ฃ๋Š”๋‹ค. priority queue size (4) == ๊ธฐํ•œ(4)

 

i = 5

priority queue ์— 100๋ฅผ ๋„ฃ๋Š”๋‹ค. priority queue size (5) > ๊ธฐํ•œ(4)

๋งจ ์œ„์— ์žˆ๋Š” ์ตœ์†Œ ๊ฐ•์˜๋ฃŒ(1)๋ฅผ ๋บ€๋‹ค.

 

 

[๋ฐ˜๋ก€]

4

2 1

3 1

4 2 

5 2

์ •๋‹ต : 9

 

5
3 3
2 3
1 3
100 4
90 4
์ •๋‹ต : 195

 

 

[์ฝ”๋“œ]

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

int universityNum, pay, day, maxPay = 0;

vector<pair<int, int>> v; // ๊ธฐํ•œ, ๊ฐ•์—ฐ๋ฃŒ ์กฐํ•ฉ์„ ์ผ๋‹จ ๋ชจ๋‘ ๋‹ด์„ ๋ฒกํ„ฐ
priority_queue<int, vector<int>, greater<int>> pq; // intํ˜•, prices(๊ฐ•์—ฐ๋ฃŒ), ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ(๊ฐ€์žฅ ์ ์€ ๊ฐ•์—ฐ๋ฃŒ๊ฐ€ ๋ฃจํŠธ์— ์œ„์น˜)

void Input();
void SearchMaxPay();
void Output();

int main() {

	Input();
	SearchMaxPay();
	Output();

	return 0;
}

void Input(){
	cin >> universityNum;

	for (int i = 0; i < universityNum; i++){
		cin >> pay >> day;
		v.push_back({ day, pay }); // day(๊ธฐํ•œ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
	}
	sort(v.begin(), v.end());
}

// priority queue ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ๋ฒ„์ „์œผ๋กœ ์ตœ๋Œ€๋น„์šฉ ์ฐพ๊ธฐ
void SearchMaxPay() {
	for (int i = 0; i < universityNum; i++) {
		pq.push(v[i].second);// ์•ž ์ผ์ž ๊ธฐํ•œ๋ถ€ํ„ฐ ๊ฐ•์—ฐ๋ฃŒ ์ผ๋‹จ ๋„ฃ๊ธฐ(์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋จ)
		// ํ˜„์žฌ pq ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ์ผ์ž ๊ธฐํ•œ์ด ํฌ๋ฉด 'd์ผ ์•ˆ์— ์™€์„œ' ๋ผ๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ
		// ๋งจ์œ„ ์ตœ์†Œ๊ฐ’์„ ๋นผ๊ณ , ๋” ํฐ๊ฐ’์„ pq์— ๋„ฃ๊ธฐ 
		if (pq.size() > v[i].first) {
			pq.pop();
		}
	}
}

void Output() {
	while (pq.size()) {
		maxPay += pq.top(); pq.pop();
	}
	cout << maxPay << "\n";
}

 

 

map ์œผ๋กœ ํ’€๋‹ค๊ฐ€ ํ‹€๋ฆฐ์ฝ”๋“œ...

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
	unordered_map<int, int> scheduleList; // key: day, value: price

	int universityNum, price, day, maxPrice = 0;
	cin >> universityNum;

	for (int i = 0; i < universityNum; i++) {
		cin >> price >> day;
		if (scheduleList.find(day) == scheduleList.end()) {
			scheduleList.insert({ day, price });
		}
		else {
			if (scheduleList[day] < price) {
				scheduleList[day] = price;
			}
		}
	}

	for (pair<int, int> schedule : scheduleList) {
		maxPrice += schedule.second;
	}

	cout << maxPrice;

	return 0;
}

 

728x90