그리디(greedy) 알고리즘
1. 그리디 알고리즘 개요
그리디 알고리즘(Greedy Algorithm)은 최적화(optimization) 문제를 해결하는 데 사용되는 알고리즘입니다.
"탐욕적 알고리즘" 또는 "탐욕적 기법"이라고도 하며, 다음과 같은 특징이 있습니다.
개념
- 입력 데이터 간의 관계를 고려하지 않고, 각 단계에서 탐욕적으로(최소/최대값) 선택
- 부분 문제의 최적해(locally optimal solution) 를 구해가며 전체 최적해(globally optimal solution) 를 찾음
최적해란? 가능한 가장 적은 수의 부분 집합을 선택해서 전체 집합 U를 모두 커버하는 해답
수행 과정
- 근시안적인 선택을 통해 부분 최적해를 찾음
- 부분 최적해를 모아 전체 최적해를 도출
- 가장 작은 값 또는 가장 큰 값을 반복적으로 선택
장점
- 알고리즘이 단순하고 해법이 빠름
응용 사례
- 구글 지도, 경영공학 운영 연구, 내비게이션, 로봇공학, 네트워크/통신, 교통공학, 무선 모바일 네트워크, 산업공학 등
2. 주요 그리디 알고리즘 응용 사례
2.1. 최소 개수 동전 교환/반환 문제
동전 교환 문제 다이어그램
- 문제 정의: 거스름돈 액수 m이 주어졌을 때, 주어진 동전 액면(500, 100, 50, 10, 1원)으로 최소 동전 수로 거스름돈을 반환
- 그리디 해법: 남은 액수를 초과하지 않는 선에서 가장 큰 액면의 동전을 최대한 선택
- 예시: 1,000원으로 340원 음료수 구입 시 660원 거스름돈 반환
- 500원 × 1 (160원 남음)
- 100원 × 1 (60원 남음)
- 50원 × 1 (10원 남 음)
- 10원 × 1 (0원 남음)
- 총 4개 동전(500, 100, 50, 10원)
- 특징: 각 단계에서 최적 선택 → 전체적으로도 최적해(항상 그런 것은 아님)
2.2. 부분 배낭(Fractional Knapsack) 문제
부분 배낭 문제 다이어그램
- 문제 정의: n개의 물건(무게, 가치)과 한정된 무게 C의 배낭이 있을 때, 최대 가치를 가지도록 물건을 담는 문제(부분적으로 담기 허용)
- 그리디 해법: 단위 무게당 가장 값어치가 높은 물건부터 담고, 남는 용량만큼 부분적으로 담음
- 예시: 최대 40g 배낭에 백금(10g, 6만원/g), 금(15g, 5만원/g), 은(25g, 4천원/g), 구리(50g, 1천원/g)
- 백금 10g(60만원), 금 15g(75만원), 은 15g(6만원) → 총 141만원
- 시간 복잡도: O(n log n)
- 응용: 자원 할당, 암호학, 투자 포트폴리오, Merkle-Hellman 암호 등
2.3. 집합 커버(Set Cover) 문제
집합 커버 문제 다이어그램
- 문제 정의: 전체 집합 U와 부분 집합들의 집합 P에서, 가능한 적은 집합을 골라 합집합이 U가 되도록 선택(최소 집합 커버)
- 그리디 해법: U의 원소를 가장 많이 포함하는 집합을 반복 선택, U에서 해당 원소 제거
- 예시: 10개 마을 중 병원 2개 배치(도보 15분 이내 커버)
v4(2,3,4,5,7,8) → v6(5,6,7,9,10) → v1(1,2,3,8) → SC={v4,v6,v1}
- 실제 최적해는 v2, v6만으로도 전체 커버 가능
- 시간 복잡도: O(n³)
- 응용: 도시계획, 감시카메라, 바이러스 검색, 생산 라인 등
2.4. 작업 스케줄링(Job Scheduling) 문제
작업 스케줄링 문제 다이어그램
- 문제 정의: n개의 작 업(t1~tn, 시작/종료 시간)을 여러 컴퓨터(또는 회의실 등)에 중복 없이 배정
- 그리디 해법: 빠른 시작시간 작업을 먼저 배치
- 수행 과정:
- 작업을 시작 시간 기준 오름차순 정렬
- 가장 이른 시작 작업부터 배치, 가능한 컴퓨터에 할당
- 시간 복잡도: O(n log n) + O(mn)
- 응용: 태스크 스케줄링, 회의실/강의실 배정, 생산 공정 등
2.5. 허프만(Huffman) 압축
허프만 트리 다이어그램
- 개요: 파일 압축 방법, 자주 나타나는 문자는 짧은 이진 코드, 드문 문자는 긴 이진 코드 할당
- 접두부 특성: 어떤 코드도 다른 코드의 접두부가 아님(구분자 불필요)
- 수행 과정:
- 각 문자로 노드 생성, 빈도수 저장
- 우선순위 큐(최소 힙) 생성
- 빈도수 작은 2개 노드 합쳐 새 노드 생성, 큐에 삽입 반복
- 마지막 노드가 허프만 트리 루트
- 왼쪽 0, 오른쪽 1 할당해 코드 생성
- 예시: T:450, X:90, Y:120, G:270 → X+Y=210, 210+G=480, 480+T=930
- 압축률 계산: (빈도수×코드길이 합)/(총문자수×8bit)×100
- 시간 복 잡도: O(n log n)
- 응용: 대용량 데이터 저장, 멀티미디어 압축, 정보 이론 등
3. 학습 정리
- 그리디 알고리즘: 데이터 간 관계를 고려하지 않고 탐욕적으로 최적 값을 선택, 부분 최적해를 통해 전체 최적해를 찾는 방법
- 최소 개수 동전 교환/반환 문제: 남은 액수를 초과하지 않는 선에서 가장 큰 액면의 동전을 취함(항상 최적해는 아님)
- 부분 배낭 문제: 단위 무게당 가장 값나가는 물건을 우선적으로 배낭에 담고, 남는 용량에 맞춰 부분적으로 담음. 시간 복잡도 O(n log n)
- 집합 커버 문제: 근사 알고리즘으로 U의 원소를 가장 많이 포함하는 집합을 선택. 시간 복잡도 O(n³)
- 작업 스케줄링 문제: 빠른 시작시간 작업을 먼저 배치. 시간 복잡도 O(n log n) + O(mn)
- 허프만 압축: 자주 나타나는 문자는 짧은 이진 코드, 드문 문자는 긴 이진 코드 할당. 시간 복잡도 O(n log n)