그리디 알고리즘이란, 말 그대로 greedy, 즉 탐욕 알고리즘이다. 그리디 알고리즘에서 가장 중요한 키워드는 '매 번의 선택에서 가장 좋아보이는 선택을 하여 적절한 답을 찾아간다'는 것이다.
서울에서 출발하여 부산을 가려 한다고 할 때, 다음 사진과 같이 경로들이 있고 각 경로에 따른 소요 시간이 적혀있다.
만약 그리디 알고리즘대로 한다면 각 순간 별 최적의 선택을 해야하니, 서울에서 이동하는 경로 중 가장 적게소요되는 '대전으로 가는 80분짜리 경로'를 선택한 뒤, 대전에서 부산으로 가는 경로 중 가장 적게 소요되는 '150분짜리 경로'를 선택하게 될 것이다.
하지만, 실제로는 서울에서 원주를 거쳐 부산으로 가는 길이 130분 + 90분 = 220분(3시간 40분)으로 앞선 240분(3시간 50분)보다 더욱 빨리 도착할 수 있다.
이런식으로 그리디 알고리즘은 '최적해에 근사하는 방법'인 것일뿐 항상 최적해를 만족하는 것이 아니다.
그리디 알고리즘이 잘 활용 될 수 있는 문제들은 대개 특징이 있는데, 1)이전의 탐욕 선택이 이후의 선택에 영향을 주지 않는다(독립적)는 점과 2)전체 최적해가 부분 문제에 대해서도 최적해를 만족한다는 것이다.
첫 번째 이미지에서는 서울에서 부산으로 이어지는 경로는 서울-대전-부산 경로밖에 없다. 즉, 서울-대전과 대전-부산의 경로는 각 독립적이기 때문에 서울-대전 경로에서 어떤 것을 선택하느냐에 따라서 대전-부산 경로의 선택에 영향을 미치지 않는다. 즉, 일단 첫 번째 조건을 만족한다.
또한 각 도시별 경로는 독립적이기 때문에 결과적으로 서울-대전의 최적해는 곧 전체 최적해의 부분 문제가 되고, 대전-부산의 최적해 또한 마찬가지다. 즉, 각 부분 문제의 최적해는 전체 문제의 최적해이자, 반대로 말하면 전체 최적해가 부분 문제에 대해서도 최적해를 만족한다는 것이다.
두 번째 이미지에서는 그럼 왜 최적해를 만족하지 못할까?
일단 서울에서 부산을 가는 도중 두 가지 도시로 나뉜다. 서울-대전을 잇는 경로와 서울-원주를 잇는 경로로 나뉘게 된다. 그렇게 되면, 이후 선택지는 대전-부산 또는 원주-부산경로로 나뉘게 되는데, 이는 처음 선택했던 경로에 따라 결정할 수 있는 경로에 영향을 미치기 때문에 독립적이지 않게 된다. 결과적으로, 독립적이지 않다는 것은 전체 최적해에 대해 부분 문제 또한 독립적이지 않아 항상 최적해를 만족하지 않는다까지 이어질 수 있다.