개발이야기/파이썬
[알고리즘] 그리디 알고리즘
Study & Stack
2025. 6. 8. 21:59
728x90
그리디 알고리즘이란?
그리디 알고리즘(Greedy Algorithm)은 최적화 문제(Optimization Problem)를 해결하기 위한 방법 중 하나로,
매 단계에서 가장 최선이라고 판단되는 선택을 반복적으로 수행하여 전체 문제의 해를 도출하는 기법이다.
그리디 알고리즘은 구현이 간단하고 수행 속도가 빠르다는 장점을 가지고 있으며, 특정한 조건을 만족하는 문제에 대해
효율적으로 적용할 수 있다.
그리디 알고리즘의 특징
각 단계에서 국소적으로 최적의 해(local optimum)를 선택하는 방식으로 전체 해(global optimum)를 도출하고자 하는 알고리즘이다. 다음 두 가지 조건을 만족하는 문제에 대해 그리디 알고리즘은 최적의 해를 보장할 수 있다.
- 탐욕적 선택 속성(Greedy Choice Property)
→ 각 단계에서의 최적 선택이 전체 문제의 최적해 구성에 포함된다. - 최적 부분 구조(Optimal Substructure)
→ 문제의 최적해는 부분 문제의 최적해로 구성될 수 있다.
알고리즘의 일반 구조
그리디 알고리즘은 다음과 같은 구조를 따른다:
- 문제의 전체 해를 구성하는 부분 문제들을 정의한다.
- 매 단계에서 현재 상황에서 가장 좋아 보이는 해를 선택한다.
- 선택된 해가 전체 해의 일부분임을 보장할 수 있어야 한다.
- 더 이상 선택할 수 없을 때까지 반복한다.
장점과 단점
구현이 간단하다 | 항상 최적해를 보장하지 않는다 |
실행 속도가 빠르다 | 그리디 조건 만족 여부를 판단해야 한다 |
일부 최적화 문제에서 매우 효율적이다 | 전체 구조를 파악하지 않고 판단한다는 위험성 존재 |
그리디 알고리즘과 다른 알고리즘 비교
핵심 차이점
구분그리디 알고리즘동적 계획법(DP)
접근 방식 | 매 단계에서 최선의 선택 | 모든 경우를 고려하여 최적해 선택 |
선택의 되돌림 | 불가능 (한번 선택하면 끝) | 가능 (이전 결과 활용) |
메모리 사용 | 적음 (현재 상태만 저장) | 많음 (부분 문제 해 저장) |
시간 복잡도 | 일반적으로 빠름 | 상대적으로 느림 |
최적해 보장 | 조건 만족시에만 | 항상 보장 |
언제 어느것을 사용할까?
🟢 그리디 사용 조건
- 탐욕적 선택 속성 만족
- 최적 부분 구조 존재
- 빠른 해답이 필요한 경우
- 근사해도 충분한 경우
🔵 DP 사용 조건
- 부분 문제가 겹치는 경우 (Overlapping Subproblems)
- 최적 부분 구조 존재
- 정확한 최적해가 필요한 경우
- 모든 경우를 고려해야 하는 경우
그리디 vs 완전 탐색(Brute Force)
핵심 차이점
구분그리디 알고리즘완전 탐색
탐색 범위 | 각 단계에서 하나의 최선 선택 | 모든 가능한 경우의 수 탐색 |
시간 복잡도 | 일반적으로 O(n log n) | 지수적 복잡도 (O(2^n), O(n!)) |
정확성 | 조건 만족시에만 최적해 | 항상 최적해 (시간만 충분하면) |
실용성 | 실시간 처리 가능 | 작은 입력에서만 실용적 |
정리
각 알고리즘은 고유한 장단점을 가지고 있으며, 문제의 특성과 요구사항에 따라 적절한 선택을 해야 한다. 그리디는 빠르고 간단하지만 최적해를 보장하지 않고, DP는 정확하지만 더 많은 시간과 메모리를 필요로 하며, 완전 탐색은 확실하지만
큰 문제에서는 비실용적이다.
실제 개발에서는 이런 특성들을 종합적으로 고려하여 요구사항에 가장 적합한 알고리즘을 선택하는 것이 중요하다.
728x90