๋ฐฑ์ค ์จ๋ผ์ธ ์ ธ์ง(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์ผ ๋๋ฅผ ์๊ฐํด๋ณด์.
์ฐ๋ฆฌ๋ ๊ฐ์ฐ์ด ์ต๋ 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
์๊ณ ๋ฆฌ์ฆ ์ค๊ธ 1/3
์๊ณ ๋ฆฌ์ฆ ์ค๊ธ
code.plus
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค - [BOJ 22856] ํธ๋ฆฌ ์ํ (0) | 2024.07.08 |
---|---|
๋ฐฑ์ค - [BOJ 1865] ์ํ (0) | 2024.07.06 |
๋ฐฑ์ค - [BOJ 3085] ์ฌํ๊ฒ์ (0) | 2024.03.01 |
๋ฐฑ์ค - [BOJ 12094] A์ B (0) | 2024.02.29 |
๋ฐฑ์ค - [BOJ 12015] ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 (1) | 2024.02.01 |