책읽기

[파이썬 알고리즘 인터뷰] 21장 - 그리디 알고리즘

pythaac 2021. 8. 30. 03:08
이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다. 

출처 : https://www.onlybook.co.kr/entry/algorithm-interview

 

  • 요약
    • 글로벌 최적을 찾기 위해 각 단계에서 로컬 최적의 선택을 하는 휴리스틱 문제 해결 알고리즘
    • (코딩 테스트에서의 정의를 의미하는듯? -> 항상 글로벌 최적을 찾기는 어려울 듯)
  • 그리디 알고리즘
    • 드물게 최적해를 보장하는 경우도 있음
    • 보통 주어진 시간 내에 그런대로 괜찮은 해를 찾는 것을 목표로 삼음
  • 최적해를 찾을 수 있는 두 가지 조건
    • 탐욕 선택 속성 (Greedy Choice Property)
      - 앞의 선택이 이후 선택에 영향을 주지 않음
      - 즉, 문제 해결 과정 중 substructure마다 독립적인 문제 해결
    • 최적 부분 구조 (Optimal Substructure)
      - 문제의 최적 해결 방법이 부분 문제에 대한 최적 해결 방법으로 구성되는 경우
      - 즉, substructure에서 구한 optimum이 global optimum으로 진행되는 것을 의미
  • 다이나믹 프로그래밍과 비교
    • 서로 풀 수 있는 문제의 성격과 알고리즘 접근 방식 모두 다름
    • 다이나믹 프로그래밍은 substructure에서 찾은 optimum을 모두 종합하여 global optimum을 찾음
    • 그리디 알고리즘은 substructure마다 optimum을 찾아 문제의 크기를 줄여나감
  • 배낭 문제
    • 정의
      - 배낭에 담을 수 있는 무게의 최대값이 주어짐
      - 각 짐의 가치와 무게가 주어짐
      - 제한된 무게에 맞게 짐을 담아 가치의 최대값 도출하는 문제
    • 종류
      - 짐을 분할할 수 있는 분할 가능 배낭 문제(Fractional Knapsack Problem)
      - 짐을 분할할 수 없는 0-1 배낭 문제
    • 그리디 알고리즘
      - 분할 가능 배낭 문제만 풀이 가능 (0-1 배낭 문제는 다이나믹 프로그래밍)
      - 1kg당 가치를 계산하여, 가치가 큰 짐부터 담는 방식
  • 동전 바꾸기 문제
    • 정의
      - 여러 종류의 동전(10원/50원/100원 등)을 최소로 사용하여 정해진 금액 만들기
    • 조건
      - 동전의 액면이 10원, 50원, 100원처럼 "이전 액면의 배수 이상"일 경우 그리디 알고리즘 적용 가능
      - 각 액면이 2배 이상인 경우, 2개 이상 사용될 동전을 1개로 줄일 수 있기 때문에 그리디 알고리즘이 적용 가능함(최적 부분 구조)
      - 80원이 추가될 경우, 다이나믹 프로그래밍 사용
      - ex) 160원을 구하는 방식에서 80원이 2개로 최소
  • 가장 큰 합
    • 정의
      - 그리디 알고리즘이 사용될 수 없는 사례
      - 정렬되지 않은 이진트리에 대해 누적합의 최대가 되도록 child를 선택하는 문제
    • 그리디 알고리즘
      - 더 작은 child의 subtree에 더 큰 수가 존재할 경우
      - ex) 7 - 3 - 12 - 99 -8 - 5 - 6
      - 3과 12중 12를 선택하여, 99에 도달하지 않음
      - substructure의 optimum이 global optimum으로 이어지지 않으므로, 최적 부분 구조를 만족하지 않음