[알고리즘] 탐욕 알고리즘(Greedy Algorithm)

2024. 8. 20. 10:03·CS/알고리즘

0. 탐욕 알고리즘이란?

탐욕 알고리즘은 최적해를 구하는 데 사용되는 근시안적인 방법이다.

일반적으로, 머리 속에 떠오르는 생각을 검증 없이 바로 구현하면 Greedy 접근이 된다.

각 선택 시점에서 이루어지는 결정은 그 순간에는 최적이지만, 그 선택이 모인 최종적인 해답이 최적이라는 보장은 없다.


1. 배낭 짐싸기(Knapsack)

배낭에 담을 수 있는 물건의 총 무게(W)가 정해져 있다.
이 때, 배낭이 수용할 수 있는 무게를 초과하지 않으면서, 값이 최대가 되는 물건을 담는 경우, 그리디 알고리즘을  생각해볼 수 있다.

1-1. 0-1 Knapsak

배낭에 물건을 통째로 담아야 하는 문제 ➡ 물건을 쪼갤 수 없는 경우

이 방식은 그리디 알고리즘을 적용하기 어렵다.

 

아래에는 총무게가 30kg인 배낭에 0-1Knapsak 방식으로 그리디하게 물건을 고르는 예시들이다.

1-1-1. 값이 비싼 물건부터 담는 경우

  무게 값
물건 1 25kg 10만원
물건 2 10kg 9만원
물건 3 10kg 5만원
  • 그리디 알고리즘
    • 물건 1 ➡ 25kg, 10만원
  • 최적해
    • 물건2, 물건 3 ➡ 20kg, 14만원

1-1-2. 무게가 가벼운 물건부터 담는 경우

  무게 값
물건 1 25kg 15만원
물건 2 10kg 9만원
물건 3 10kg 5만원
  • 그리디 알고리즘
    • 물건 2, 물건 3 ➡ 20kg, 14만원
  • 최적해
    • 물건1 ➡ 25kg, 15만원

1-1-3. 무게 당 값이 높은 물건부터 담는 경우

  무게 값 값/kg
물건 1 5kg 50만원 10만원/kg
물건 2 10kg 60만원 6만원/kg
물건 3 20kg 140만원 7만원/kg
  • 그리디 알고리즘
    • 물건 1, 물건 3 ➡ 25kg, 190만원
  • 최적해
    • 물건 2, 물건 3 ➡ 30kg, 200만원

1-2. Fractional Knapsack

물건을 부분적으로 담는 것이 허용되는 문제 ➡ 물건을 쪼갤 수 있는 경우

이 방식은 그리디 알고리즘을 적용할 수 있다.

  무게 값 값/kg
물건 1 5kg 50만원 10만원/kg
물건 2 10kg 60만원 6만원/kg
물건 3 20kg 140만원 7만원/kg
  • 그리디 알고리즘
    • 물건 1 5kg + 물건 3 20kg + 물건 2 5kg ➡ 30kg 220만원

2. 탐욕 알고리즘 적용 문제

https://www.acmicpc.net/problem/5585

https://www.acmicpc.net/problem/1931


3. 대표적인 탐욕 기법의 알고리즘

알고리즘 목적 설명 유형
Prim N개의 노드에 대한 최소 신장 트리(MST)를 찾는다. 서브트리를 확장하면서 MST를 찾는다. 그래프
Kruskal 싸이클이 없는 서브 그래프를 확장하면서 MST를 찾는다. 그래프
Dijkstra 주어진 정점에서 다른 정점들에 대한 최단 경로를 찾는다. 주어진 정점에서 가장 가까운 정점을 찾고,
그 다음 정점을 반복해서 찾는다.
그래프

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'CS/알고리즘' 카테고리의 다른 글
  • [알고리즘] 백트래킹(Backtracking)
  • [알고리즘] 이진 탐색(Binary Search)
  • [알고리즘] 순열, 조합 응용: Next Permutation
  • [알고리즘] 순열, 조합, 부분 집합
Dreaming-J
Dreaming-J
개발자로 성장해가는 과정을 기록하기 위한 공간
    반응형
  • Dreaming-J
    꿈꾸는 개발 공간
    Dreaming-J
  • 전체
    오늘
    어제
    • 카테고리 (46)
      • Infra (2)
      • CS (25)
        • 네트워크 (3)
        • 운영체제 (3)
        • 자료구조 (4)
        • 알고리즘 (15)
      • JAVA (10)
        • IntelliJ (1)
        • Stream (2)
        • String (4)
        • Map (1)
        • 기타 (1)
      • Git·Github (7)
      • 독서 (2)
        • 객체지향 설계 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    동적 계획법
    다익스트라
    조합
    dp
    워샬
    sort
    Git
    github
    java
    0/1
    코딩테스트
    disjoint
    Kruskal
    독서
    Dijkstra
    GitLab
    자료구조
    Prim
    알고리즘
    순열
    정렬
    집합
    Binary search
    stream
    0/1 knapsack
    탐색
    워셜
    그래프
    플로이드-워샬
    string
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Dreaming-J
[알고리즘] 탐욕 알고리즘(Greedy Algorithm)
상단으로

티스토리툴바