밍쎄의 코딩공간

그리디(Greedy) 본문

개념정리

그리디(Greedy)

밍쎄 2023. 8. 13. 22:38
자바에서의 그리디(Greedy) 알고리즘은 최적해를 찾는 문제를 해결하기 위한 한 가지 접근 방법이다. 
그리디 알고리즘은 각 단계에서 가장 최선의 선택을 하여 전체 문제의 최적해를 찾아내는 방식으로 작동한다.
그리디 알고리즘의 일반적인 구현 단계
  • 문제 이해 및 모델링: 문제를 잘 이해하고, 최적해를 찾기 위한 그리디 전략을 정의한다.
  • 탐욕 선택 기준 정의: 각 단계에서 가장 좋은 선택을 어떤 기준으로 판단할 것인지 정의한다. 이 선택 기준은 문제의 특성에 따라 다를 수 있다.
  • 탐욕적 선택 수행: 정의한 선택 기준에 따라 각 단계에서 최선의 선택을 수행한다.
  • 유효성 검사 및 해 검증: 선택한 해가 문제의 조건을 만족하는지 검사하고, 전체 해가 올바른지 검증한다.

밑 예제는 거스름돈을 줄 때 가장 적은 동전 개수로 거슬러 주는 문제를 예로 들어보겠다.

예제) 거스름돈

 

public class GreedyExample {
    public static void main(String[] args) {
        int[] coins = {500, 100, 50, 10};
        int amount = 1260;
        int count = 0;

        for (int i = 0; i < coins.length; i++) {
            int coinCount = amount / coins[i]; // 현재 동전 단위로 거슬러 줄 수 있는 개수
            count += coinCount; // 동전 개수 누적
            amount -= coinCount * coins[i]; // 사용한 동전만큼 거스름돈에서 빼기
        }

        System.out.println("Minimum number of coins: " + count);
    }
}

위 코드는 그리디 알고리즘을 사용하여 거스름돈을 최소한의 동전 개수로 계산하는 예제이다.

각 단계에서 가장 큰 동전부터 선택하여 거스름돈을 계산하고, 선택한 동전의 개수를 누적한다.

 

알고리즘의 대표적인 문제
  • 거스름돈 문제(Change-making Problem)
    가장 대표적인 그리디 알고리즘 예시로, 가장 큰 단위의 동전부터 사용하여 최소한의 동전 개수로 거스름돈을 만드는 문제이다.
  • 부분 배낭 문제(Fractional Knapsack Problem)
    주어진 가방의 용량에 최대한 가치가 높은 물건을 넣는 문제로, 물건을 일부 분할하여 넣을 수 있을 때 그리디 알고리즘이 사용된다.
  • 활동 선택 문제(Activity Selection Problem)
    여러 활동들 사이에서 시간이 겹치지 않게 최대한 많은 활동을 선택하는 문제이다. 종료 시간이 빠른 활동을 우선적으로 선택하는 그리디 전략이 적용된다.
  • 탐욕적 스케줄링 문제(Greedy Scheduling Problem)
    일정 시간 내에 가장 많은 작업을 처리하는 문제에서도 그리디 알고리즘이 사용될 수 있다.
  • 다익스트라 최단 경로 알고리즘
    그래프에서 출발점으로부터 각 정점까지의 최단 경로를 구하는 알고리즘으로, 그리디 알고리즘의 한 예이다.
  • 크루스칼 최소 신장 트리 알고리즘
    그래프에서 모든 정점을 포함하는 트리를 만들기 위해 가장 작은 가중치의 간선을 선택하는 알고리즘으로, 그리디 알고리즘의 한 예이다.
  • 허프만 코딩(Huffman Coding)
    데이터 압축을 위한 트리 기반 알고리즘으로, 빈도가 높은 문자에 더 짧은 코드를 할당하여 효율적인 압축을 달성하는 그리디 알고리즘의 한 예이다.
  • 최대 수입 스케줄링 문제(Maximum Revenue Scheduling Problem)
    각 작업마다 수익과 완료 시간이 주어질 때, 최대 수입을 얻을 수 있는 작업 스케줄을 선택하는 문제이다.
728x90

'개념정리' 카테고리의 다른 글

스프링 핵심 원리 기본편 정리  (0) 2023.08.20
깊이 우선 탐색 ( DFS )  (0) 2023.08.13
배열  (0) 2023.08.12
개념정리 - CRUD  (0) 2023.08.06
개념정리 - Trie  (0) 2023.08.06