- "지금 당장 가장 좋은 선택"을 반복하면 전체적으로도 최적해가 된다는 아이디어
- 그리디는 "직관"과 "패턴 인식"이 중요
- 많은 문제를 풀어보면서 감을 익히는 것이 핵심
- 무엇을 기준으로 "최선"을 판단할 것인가?
- 예: 끝나는 시간, 가치/무게 비율, 최소 비용
- 대부분의 그리디는 정렬이 필요
- 선택 기준에 따라 오름차순/내림차순
- 조건에 맞으면 선택, 안 맞으면 건너뛰기
- 선택한 것이 최적해인지 검증
- 회의실 배정, 수업 시간표
- 핵심: 끝나는 시간 기준 정렬
- 가치/무게 비율로 정렬
- 비율이 높은 것부터 선택
- 최소 신장 트리, 다익스트라
- 가장 작은 비용부터 선택
- 겹치지 않는 구간 선택
- 구간 합치기
- 현재의 선택이 미래에 영향 X
- 부분 최적해 = 전체 최적해
- 보통 O(n) 또는 O(n log n)
- 여러 경우를 비교해야 함
- 이전 선택이 다음 선택에 영향
- 보통 O(n²) 이상
- "가장 큰", "가장 작은", "최대", "최소"
- "~를 최대한 많이"
- 정렬하면 명확한 선택 기준이 보임
- 모든 경우를 확인해야 함
- 이전 선택을 번복해야 할 수도 있음
- 최적 부분 구조가 성립하지 않음
- 직관적인 선택 기준 찾기
- 반례가 있는지 확인
- 그리디 실패 = 보통 DP 문제
- 코딩 테스트에서는 직관이 중요
- 몇 가지 예시로 검증