그리디
빠른 설명
그리디는 매 순간 가장 좋아 보이는 선택을 하는 알고리즘이다. 단, 그 선택이 전체 최적해로 이어진다는 근거가 있어야 한다.
언제 쓰는가
- 정렬 후 앞에서부터 선택하는 문제
- 회의실 배정, 동전, 구간 선택처럼 지역 선택이 전체 선택으로 이어지는 문제
- “최소”, “최대”가 나오지만 DP까지는 필요 없어 보이는 문제
시간복잡도
- 정렬이 필요하면 보통
- 정렬 뒤 한 번 훑으면
참고자료
C++ 코드
#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
int main() {
vector<pair<int, int>> meetings = {{1, 4}, {2, 3}, {3, 5}, {6, 8}};
sort(meetings.begin(), meetings.end(), [](auto a, auto b) {
return a.second < b.second;
});
int count = 0;
int last_end = -1;
for (auto [start, end] : meetings) {
if (start >= last_end) {
count++;
last_end = end;
}
}
cout << count << '\n';
}Python 코드
meetings = [(1, 4), (2, 3), (3, 5), (6, 8)]
meetings.sort(key=lambda x: x[1])
count = 0
last_end = -1
for start, end in meetings:
if start >= last_end:
count += 1
last_end = end
print(count)