본문 바로가기
자료구조와 알고리즘

그리디(Greedy) 알고리즘

by 매트(Mat) 2020. 9. 5.

그리디 알고리즘

그리디(Greedy) 알고리즘, 다른 말로 탐욕법은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 뜻합니다.

일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구합니다. 즉, 특정한 문제를 만났을 때 단순히 현재 상황에서 가장 좋아 보이는 것만을 선택해도 문제를 풀 수 있는지를 파악할 수 있어야 합니다.

그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이므로 '가장 큰 순서대로', '가장 작은 순서대로' 와 같은 기준을 알게 모르게 제시해줍니다. 이 기준은 정렬 알고리즘을 사용했을 때 만족시킬 수 있으므로 그리디 문제는 정렬 알고리즘과 같이 자주 출제됩니다.

또한 그리디 알고리즘은 정당성 분석이 중요합니다.

  • 단순히 가장 좋아보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는지 검토

대표적인 문제

  • 거스름 돈

거스름돈으로 사용할 500, 100, 50, 10 (원) 동전이 무한히 있습니다.
손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러줘야 할 동전의 최소 개수
(단, 거슬러 줘야 할 돈 N은 항상 10의 배수)

해설

가장 큰 화폐 단위부터 돈을 거슬러 주면 됩니다.

코드

package com.minsu.algorithm;

public class Main {
    public static void main(String[] args) {
        int n = 1260; // 거스름돈
        int cnt = 0; // 최소 갯수
        int[] coinTypes = {500, 100, 50, 10}; // 동전 종류

        for (int i=0; i<coinTypes.length; i++) {
            int coin = coinTypes[i]; // 각 동전을 coin에 담는다.
            cnt += n / coin; // 개수를 구한다.
            n %= coin; // 앞에서 나눈 n의 나머지
        }
        System.out.println(cnt);
    }
}

시간 복잡도

화폐의 종류가 X 라고 하면, 시간 복잡도는 O(X) 입니다.
for 문에서도 coinTypes 갯수 만큼 돌리기 때문에 돈과 상관없이 오직 화폐의 종류에 따라 시간 복잡도를 결정됩니다.

정당성

위의 문제같은 경우는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문에 해결할 수 있습니다.

다만, 종류가 500, 400, 100 있을 때 800원을 거슬러 줘야 한다면? (400 + 400)
최소 개수는 2개입니다.


대부분의 그리디 문제는 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 답을 도출할 수 있습니다.

Reference

나동빈님의 이것이 코딩테스트다 책

 

'자료구조와 알고리즘' 카테고리의 다른 글

큐(Queue)  (0) 2023.02.28
스택(Stack)  (0) 2023.02.28
단방향 LinkedList에 대해 간략히 알아보자.  (0) 2023.02.26
계수 정렬(Counting Sort)  (0) 2020.08.07
자료구조 기초  (0) 2020.07.30

댓글