[C++] ๊ทธ๋ฆฌ๋””(Greedy)

2020. 4. 29. 18:36ยท๐Ÿ“ Computer Science/โœ Algorithm

๊ทธ๋ฆฌ๋””(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;
    }
};
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] ์ด๋ถ„ ํƒ์ƒ‰(Binary Search)
  • [C++] ๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)
  • [C++] ๋ฐฑ ํŠธ๋ž˜ํ‚น(Back Tracking)
  • [C++] ๋ธŒ๋ฃจํŠธ ํฌ์Šค(Brute Force)
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] ๊ทธ๋ฆฌ๋””(Greedy)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”