๊ทธ๋ฆฌ๋(Greedy)
๊ฐ ๋จ๊ณ์์ ์ต์ ์ ์ ํ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์์ ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
- Greedy Choice Property (ํ์ ์ ํ ์์ฑ)
- ๊ตญ์ ์ต์ ์ ํ์ด ์ ์ฒด ์ต์ ํด๋ก ์ด์ด์ง๋ค.
- ํ์ฌ ๋จ๊ณ์์ ๊ฐ์ฅ ์ข์ ๋ณด์ด๋ ์ ํ์ด ์ดํ์๋ ์ ์ฒด์ ์ผ๋ก ์ต์ ์ธ ๊ฒฐ๊ณผ๋ก ์ด์ด์ง๋ค๋ ์์ฑ์ด๋ค.
- Optimal Substructure (์ต์ ๋ถ๋ถ ๊ตฌ์กฐ)
- ๋ฌธ์ ๋ฅผ ๋ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๊ณ , ๊ทธ ์์ ๋ฌธ์ ์ ์ต์ ํด๋ค์ ์กฐํฉํด์ ์ ์ฒด ์ต์ ํด๋ฅผ ๋ง๋ค ์ ์์ด์ผ ํ๋ค.
- Exchange Argument (๊ตํ ๋
ผ๋ฒ)
- ์์์ ์ต์ ํด๋ฅผ ๊ทธ๋ฆฌ๋ ํด์ ๋ค๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด, ์ด๋ฅผ ์ ์ง์ ์ผ๋ก ๋ฐ๊ฟ์ ๊ทธ๋ฆฌ๋ ํด์ฒ๋ผ ๋ง๋ค ์ ์๊ณ ์ฑ๋ฅ์ด ๋จ์ด์ง์ง ์๋๋ค.
๋ฌธ์
https://www.acmicpc.net/problem/1931
1931๋ฒ: ํ์์ค๋ฐฐ์
(1,4), (5,7), (8,11), (12,14) ๋ฅผ ์ด์ฉํ ์ ์๋ค.
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<pair<int, int>> v(n); // ๋๋๋ ์๊ฐ, ์์ ์๊ฐ
for (int i = 0; i < n; i++)
cin >> v[i].second >> v[i].first;
sort(v.begin(), v.end());
int ans = 1, next = v[0].first;
for (int i = 1; i < n; i++)
if (next <= v[i].second) {
next = v[i].first;
ans++;
}
cout << ans;
}
https://www.acmicpc.net/problem/2457
2457๋ฒ: ๊ณต์ฃผ๋์ ์ ์
์ฒซ์งธ ์ค์๋ ๊ฝ๋ค์ ์ด ๊ฐ์ N (1<=N<=100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ๊ฝ์ด ํผ๋ ๋ ์ง์ ์ง๋ ๋ ์ง๊ฐ ์ฃผ์ด์ง๋ค. ํ๋์ ๋ ์ง๋ ์๊ณผ ์ผ์ ๋ํ๋ด๋ ๋ ์ซ์๋ก ํํ๋๋ค. ์๋ฅผ ๋ค์ด์, 3 8 7
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Flower
{
int startDay;
int endDay;
};
// ์ ๋ ฌ ํธ์๋ฅผ ์ํด ์์ผ์ ์ผ(365)๋ก ๋ณ๊ฒฝ
int MonthEndDay[12]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
int ChangeMonthToDay(int month, int day)
{
int totalday = 0;
for (int i = 0; i < month - 1; ++i)
totalday += MonthEndDay[i];
return totalday + day;
}
int main()
{
int N;
cin >> N;
vector<Flower> v(N);
for (int i = 0; i < N; ++i) {
int month, day;
cin >> month >> day;
v[i].startDay = ChangeMonthToDay(month, day);
cin >> month >> day;
v[i].endDay = ChangeMonthToDay(month, day);
}
sort(v.begin(), v.end(), [](Flower a, Flower b) { return a.startDay < b.startDay; });
int ans = 0;
int day31 = ChangeMonthToDay(3, 1), day1130 = ChangeMonthToDay(11, 30);
for (int i = -1, startDay = day31, endDay = 0; i < N && startDay <= day1130;) {
bool flag = false;
i++;
for (int j = i; j < N; j++) {
if (startDay < v[j].startDay)
break;
if (endDay < v[j].endDay) {
flag = true;
i = j;
endDay = v[j].endDay;
}
}
if (flag) {
ans++;
startDay = endDay;
}
else {
cout << 0;
return 0;
}
}
cout << ans;
}
https://www.acmicpc.net/problem/2217
2217๋ฒ: ๋กํ
N(1≤N≤100,000)๊ฐ์ ๋กํ๊ฐ ์๋ค. ์ด ๋กํ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฐ ์ ๋ฐ ๋ฌผ์ฒด๋ฅผ ๋ค์ด์ฌ๋ฆด ์ ์๋ค. ๊ฐ๊ฐ์ ๋กํ๋ ๊ทธ ๊ตต๊ธฐ๋ ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค ์ ์๋ ๋ฌผ์ฒด์ ์ค๋์ด ์๋ก ๋ค๋ฅผ ์๋ ์๋ค. ํ์ง๋ง
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; ++i)
cin >> v[i];
sort(v.rbegin(), v.rend());
int ans = 0;
for (int i = 1; i <= n; ++i)
ans = max(ans, v[i - 1] * i);
cout << ans;
}
https://www.acmicpc.net/problem/1422
1422๋ฒ: ์ซ์์ ์
์ฒซ์งธ ์ค์ K์ N์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. K์ N์ ๊ฐ๊ฐ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , N์ K๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค. ๋์งธ ์ค์๋ K๊ฐ์ ์๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ๊ฐ ์๋ 1,000,000,000๋ณด๏ฟฝ๏ฟฝ
www.acmicpc.net
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
int K, N;
cin >> K >> N;
int len = 0;
vector<string> v(K);
for (int i = 0; i < K; ++i) {
cin >> v[i];
len = max(len, (int)v[i].length());
}
sort(v.begin(), v.end(), [](const string& a, const string& b) {
return a + b > b + a;
});
for (int i = 0, j = N - K; i < K; ++i) {
while (len == (int)v[i].length() && j-- > 0)
cout << v[i];
cout << v[i];
}
}
https://www.acmicpc.net/problem/13305
13305๋ฒ: ์ฃผ์ ์
ํ์ค ์ ๋ ฅ์ผ๋ก ๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ์ฒซ ๋ฒ์งธ ์ค์๋ ๋์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ N(2 ≤ N ≤ 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ ์ธ์ ํ ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๊ธธ์ด๊ฐ ์ ์ผ ์ผ์ชฝ ๋๋ก๋ถํฐ N-1
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
vector<int> a(N - 1), b(N);
for (int i = 0; i < N - 1; ++i)
cin >> a[i];
for (int i = 0; i < N; ++i)
cin >> b[i];
long long ans = 0;
for (int i = 0, tmp = b[0]; i < N - 1; ++i) {
ans += (long long)tmp * a[i];
tmp = min(tmp, b[i + 1]);
}
cout << ans;
}
https://www.acmicpc.net/problem/1202
1202๋ฒ: ๋ณด์ ๋๋
๋ฌธ์ ์ธ๊ณ์ ์ธ ๋๋ ์๋์ด๋ ๋ณด์์ ์ ํธ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์๋์ด๊ฐ ํธ ๋ณด์์ ์๋ ๋ณด์์ด ์ด N๊ฐ ์๋ค. ๊ฐ ๋ณด์์ ๋ฌด๊ฒ Mi์ ๊ฐ๊ฒฉ Vi๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์๋์ด๋ ๊ฐ๋ฐฉ์ K๊ฐ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ ๊ฐ๋ฐฉ์ ๏ฟฝ
www.acmicpc.net
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
int N, K;
cin >> N >> K;
vector<pair<int, int>> gem(N);
for (int i = 0; i < N; ++i)
cin >> gem[i].first >> gem[i].second;
sort(gem.begin(), gem.end());
vector<int> bag(K);
for (int i = 0; i < K; ++i)
cin >> bag[i];
sort(bag.begin(), bag.end());
long long ans = 0;
priority_queue<int> pq;
for (int i = 0, j = 0; i < K; ++i) {
while (j < N && gem[j].first <= bag[i]) {
pq.push(gem[j++].second);
}
if (!pq.empty()) {
ans += pq.top();
pq.pop();
}
}
cout << ans;
}
https://www.acmicpc.net/problem/1826
1826๋ฒ: ์ฐ๋ฃ ์ฑ์ฐ๊ธฐ
์ฒซ์งธ ์ค์ ์ฃผ์ ์์ ๊ฐ์ N(1 ≤ N ≤ 10,000)๊ฐ ์ฃผ์ด์ง๊ณ ๋ ๋ฒ์งธ ์ค๋ถํฐ N+1๋ฒ์งธ ์ค ๊น์ง ์ฃผ์ ์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ์ฃผ์ ์์ ์ ๋ณด๋ ๋๊ฐ์ ์ ์ a,b๋ก ์ด๋ฃจ์ด ์ ธ ์๋๋ฐ a(1 ≤ a ≤ 1,000,000)๋ ์ฑ๊ฒฝ
www.acmicpc.net
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main(void)
{
int n;
cin >> n;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; i++)
cin >> v[i].first >> v[i].second;
sort(v.begin(), v.end());
int home, remain;
cin >> home >> remain;
int ans = 0, index = 0;
priority_queue<int> pq;
while (remain < home) {
while (index < n && v[index].first <= remain)
pq.push(v[index++].second);
if (pq.empty())
break;
ans++;
remain += pq.top();
pq.pop();
}
if (remain < home)
cout << -1;
else
cout << ans;
}
https://leetcode.com/problems/gas-station/description/
LeetCode - The World's Leading Online Programming Learning Platform
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
#include <vector>
using namespace std;
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
long sum = 0;
for (int i = 0; i < gas.size(); ++i)
sum += gas[i] - cost[i];
if (sum < 0)
return -1;
int index = 0;
sum = 0;
for (int i = 0; i < gas.size(); ++i) {
sum += gas[i] - cost[i];
if (sum < 0) {
sum = 0;
index = i + 1;
}
}
return index;
}
};