Algorithm

그리디 알고리즘

IagreeBUT 2023. 1. 2. 13:24
728x90

 

그리디 알고리즘

현재상황에서 가장 좋아보이는 것만 선택하는 알고리즘

현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는다 

 

사용하는 경우 

  • 사전에 외우고 있지 않아도 풀 수 있을 가능성이 높은 문제
  • 시간 복잡도 O(N)이므로, 입력 범위가 크다 (1,000,000 < N)
  • 어떤 기준에 따라 좋은 것을 선택하기 때문에 숨겨진 기준이 존재한다 → 정렬과 함께 사용될 가능성이 높음

 

특징

  • 사전에 외우고 있지 않아도 풀 수 있을 가능성이 높은 문제
  • 창의력, 문제를 풀기 위한 아이디어를 떠올 릴 수 있어야 함
  • 현재의 최적의 선택해 == 전체 문제의 최적의 선택해 가 되어야 함 
    • 모든 문제에서 정당한 해법이 아닐 수 있음 ( 현재 최적의 선택해 != 전체 문제의 최적해) 
    • 수학적 증명이 많이 필요함 (판단이 어려움)
    • 코딩 테스트는 주로 비슷한 유형/직관으로 판단가능 한 문제가 출제되므로 연습을 통해 감을 익혀야 함 

 

참고) 

다익스트라 알고리즘(최단경로) 는 엄밀히 그리디 알고리즘이다 

일단 문제를 만나면 그리디로 가능한지 생각해보고 아니라면 다이나믹, 그래프 알고리즘을 떠올려보자 

 

 

예시

예제 3-1 거스름돈


카운터에 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 "무한히 존재"한다고 가정한다.
손님에게 거슬러줘야할 돈이 N원 일 때, 거슬러줘야할 동전의 "최소 갯수"를 구하여라.
단, 거슬러 줘야할 돈 N은 항상 10의 배수이다.

using namespace std;

int coins[4] = {500, 100, 50, 10};


int main() {

    int n;
    cin >> n;

    int ans = 0;

    //시간 복잡도 : O(화폐의 가짓수) -> 최대 4번 작동함
    for(int idx=0; idx<4; idx++){
        ans += n/coins[idx];
        n = n%coins[idx];
        idx++;
    }


    cout << ans;
    

}

시간 복잡도는 O(화폐의 가짓 수)로 남아있는 거스름돈의 크기와는 무관하다 

 

순간의 최적해인 "가장 단위가 큰 동전부터 거슬러 주는 것"이 전체의 최적의 해가 될 수 있는 이유

가지고 있는 동전 중 큰 단위가 항상 작은 단위의 배수가 되기 때문에 큰 단위의 동전은 작은 단위의 동전들을 조합해 만들어 낼 수 있기 때문이다 (따라서 작은 단위의 동전을 선택할 경우 최소 갯수가 될 수 없음)

즉, 동전의 단위가 서로 배수 형태가 아니라 무작위인 경우에는 그리디를 사용할 수 없다 → 다이나믹 프로그래밍으로 해결 가능 

728x90