본문 바로가기

Computer Science

[Computer Science] 자료구조 - 탐욕알고리즘 Greedy

탐욕알고리즘은 발견법(heuristic method)의 방법중 하나.

발견법(heuristic method)

  • 최선, 최적의 답을 찾기보다도 주어진 상황을 한단계씩 빠른 시간 내에 해결하기 위해 사용하는 방법론
    • backtracking(역추적)과 같이 알고리즘 수행시간이 많이 걸릴 때 사용하는 방법 (역추적과 구조는 비슷하지만 방법이 다름)
  • 탐욕법은 이전의 선택으로 돌아가는 역추적과는 반대개념으로, 다른 문제들과 독립적이다

 

탐욕법이 쓰이는 실제상황예시

1) 여행짐싸기(물건담기) :

  • 여행 배낭에 물건을 정해진 시간 내에 담으려는 경우, 우선순위가 높은 순서대로 물건을 담을 때 한번 배낭에 담은 물건은 다시 빼지 않는다.

2) 여행경로 짜기(도시방문) :

  • 도시가 많아질 수록, 도시를 방문(배열)할 수 있는 가짓수가 많아진다.
  • 알고리즘 연산 비용도 함께 증가한다. 이러한 상황에서 탐욕 알고리즘을 활용한다.
    • 1) 방문하지 않은 도시 중 가장 가까운 도시로 간다.
    • 2) 모든 도시를 방문할 때까지 반복한다.

3) 전력망 연결(전력공급) :

  • 발전소 한 개로 여러 마을에 전력을 공급하는 경우, 최소비용을 들여서 모든 마을에 전력을 공급하려면 어떻게 해야 하는가?
    • 1) 전력이 공급되지 않은 마을과 공급되는 마을의 사이가 가장 가까운 것을 골라, 두 마을을 연결한다.
    • 2) 모든 마을에 전력이 공급될 때까지 반복한다

DP와 Greedy의 차이점

최적 부분 구조 문제를 푼다는 점에서 비교된다.
  • DP
    • 중복되는 서브문제
    • 문제를 작은 단위로 분할하여 해결한 후, 해결된 중복문제들의 결과를 기반으로 전체문제를 해결한다.
  • Greedy
    • 중복되지 않는 서브문제
    • 각 단계마다 최적해를 찾는 문제로 접근한다
    • 해결해야 할 전체문제의 갯수를 줄이기위해 개별적으로 문제를 해결해나가는 선택을 한다.

탐욕알고리즘 의사코드

# 탐욕 알고리즘에 대해 의사코드로 이해해보자.

def greedy(items, max_weight):
  bag_weight = 0          # 정해진 가방무게
  bag_items = list()      # 가방에 담을 물건들을 리스트에 담는다.

  for each_item in sort_by_value(items):        # 각각의 물건을 우선순위에 맞게 담기 위한 반복작업
    if max_weight >= bag_weight + item.weight:  # 가방무게가 꽉차기 전까지 물건의 무게와 비교한다.
      bag_weight = bag_weight + item.weight     # 가방에 물건이 담길 때마다 가방의 무게가 찬다.
      bag_items.append(item)                    # 가방에 물건이 담긴다.
  
  return bag_items    # 가방의 물건이 무엇이 담겼는지 확인한다.