• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Greedy

를 공부할 땐

image

를 들어줘야 하는 것이 규칙 ㅋ

Greedy 알고리즘

미래를 생각하지 않고 각 단계에서 가장 최선의 선택을 하는 기법

해당 순간의 선택은 그 당시 최적 (locally optimal) 일 수는 있으나
최종적으로 최적 (globally optimal) 이라는 보장은 없음 : 확인해야 함!!

최소 신장 트리

minimum spanning tree

주어진 가중치 그래프에서 사이클 없이 모든 점들을 연결시킨 트리들 중
선분들의 가중치 합이 최소인 트리

image : 가중치 그래프

image : 최소 신장 트리

image : 신장 트리 (사이클은 없지만 가중치 합이 최소는 아님)

그리디 - 크러스컬 알고리즘

모든 노드 중 가중치가 가장 작은 선분이 사이클을 만들지 않을 때에 그리디하게 그 선분을 추가

image

요런 가중치 그래프가 있을 때

image

이렇게 선분들을 가중치 순서대로 정렬 후, 가장 작은것 부터 추가한다.
추가 할 때, 사이클을 만들지 않는 한에서 선분을 선택!

그리디 - 프림 알고리즘

처음에 임의의 점을 선택

열려 있는 노드 중 가중치가 가장 적은 선분이 사이클을 만들지 않을 때에만 그리디하게 그 선분을 추가

최적해인지 확인하기

그리디 - 크러스컬, 그리디 - 프림 알고리즘을 사용해서 구한 해(최소신장트리)가 다르다.
어떤 경우에서는 다른 최적해가 있을 수 있다.
But… 현실 세계에서는 최적해를 하나하나 찾거나 검토하기보단
그냥 그리디로 찾고 최적해가 아니더라도 즐거운 마음으로 사용하는 경우도 많다고 한다.

추가로, 코테에서는 그리디를 쓰는 문제라면 그리디를 썼을 때 최적해가 나오는 문제만 출제!

정리

  • 순간 최적 해를 모았을 때 전체 최적 해가 되는 경우에 사용
  • 그리디는 DP를 보강해주는 좋은 친구가 될 수 있다.
    • 동적 프로그래밍에서 필요하지 않은 케이스조차 탐색하는 불필요한 탐색시간을 줄여줄 수 있다.
    • 그 결과 동적 프로그래밍보다 시간 복잡도가 대체적으로 낮다.
  • 왠지 그냥 이렇게 하면 될 것 같은데? 정말 될 것 같은데?? 나 이거 이래도 되는거지??? 라는 감이 오는데 반례가 금방 보이지 않는다면! 그리디로 밀고 간다.
    • 특히 제약 조건이 많은 문제의 경우 그리디로 풀면 대부분 잘 풀린다고 한다. (안 풀릴 수도 있다)