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

알고리즘: 그리디 알고리즘(Greedy Algorithm)

by vita12321 2023. 9. 4.
728x90
반응형

이번 글에서는 '그리디 알고리즘' 개념과 원리를 상세히 설명하고, 자바에서 그리디 알고리즘을 사용하는 예제 코드를 제공하겠습니다. 먼저, 그리디 알고리즘의 개념과 원리에 대해 깊게 살펴보겠습니다. 그다음으로 자바에서 그리디 알고리즘을 사용하는 방법과 기본 연산에 대해 자세히 설명하겠습니다. 마지막으로 성능 측면을 고려한 구현 방법에 대해서도 논의하겠습니다.


1. 그리디 알고리즘의 개념 원리

 

'그리디(Greedy)'라는 이름은 '탐욕적인'이라는 의미로, 순간 최적이라 생각되는 선택을 하는 것입니다. 기법은 주로 문제를 여러 작은 부분 문제로 나누어 해결합니다.

 

기본적으로, 그리디 기법은 단계에서 지금 당장 가장 좋아 보이는 선택을 합니다. 이렇게 단계에서 최선의 선택을 함으로써 최종 결과물이 전체적으로 최선(최소 혹은 최대)이 되도록 하는 것입니다.

 

예를 들어 거스름돈 문제나 분할 가능 배낭 문제 등에 주로 사용됩니다. 거스름돈 문제에서는 가장 동전부터 차례대로 거슬러 줌으로써 동전의 수를 최소화합니다. 분할 가능 배낭 문제에서는 무게 대비 가치가 가장 물건부터 차례대로 넣음으로써 배낭의 총가치를 최대화합니다.


2. 자바에서의 그리디 알고리즘 사용법 주요 기능

 

자바 작성된 코드 내부에서 그리디 기법은 아래와 같은 형태로 구현됩니다:

int[] coins = {1, 5, 10};

int target = 16;

Arrays.sort(coins);

int count = 0;

 

for (int i = coins.length - 1; i >=0; i--) {

    while (target >= coins[i]) {

        target -= coins[i];

        count++;

    }

}

 

System.out.println(count);

 

코드는 거스름돈 문제를 해결하는 예시입니다. 여기서 우선 동전들을 크기 순서대로 정렬한 가장 동전부터 차례대로 타겟 값(target) 비교하여 처리합니다.

 

이러한 그리디 알고리즘은 '탐욕적 선택 속성' '최적 부분 구조'라는 가지 속성을 만족해야 합니다. 탐욕적 선택 속성은 단계에서의 지역적인 최적해가 전역 최적해로 이어진다는 것을 의미하며, 최적 부분 구조는 문제의 최적해가 부분 문제들의 최적해로부터 구성된다는 것을 의미합니다.


3. 성능 측면을 고려한 구현 방법

 

그리디 알고리즘은 일반적으로 O(n log n) 시간 복잡도를 가집니다. 이는 주로 데이터를 정렬하는데 필요한 시간 때문입니다. 따라서, 데이터의 크기가 클수록 알고리즘이 매우 효율적으로 작동합니다.

 

하지만 그리디 알고리즘이 항상 최선의 해를 보장하는 것은 아닙니다. 문제에 따라서는 그리디 방식이 전체 문제에 대한 최선의 해결책이 아닐 있습니다. 예를 들어, 건너뛸 있는 경유지가 있는 여행자 문제나 집합 커버 문제 등에서 그리디 기법만으로는 항상 최선의 해결책을 찾지 못할 있습니다.


4. 예제 코드

 

다음은 자바로 구현한 그리디 알고리즘 예제 코드입니다:

public class Main {

    public static void main(String[] args) {

        int[] coins = {1, 5, 10};

        int target = 16;

        Arrays.sort(coins);

        int count = 0;

 

        for (int i = coins.length - 1; i >=0; i--) {

            while (target >= coins[i]) {

                target -= coins[i];

                count++;

            }

        }

 

        System.out.println(count);

    }

}

 

코드는 거스름돈 문제를 해결하는 프로그램입니다.


5. 결론

 

그리디 알고리즘은 주로 단계에서 최선의 선택을 하여 전체적인 최선의 결과를 얻기 위해 사용됩니다. 하지만 모든 경우에 대해 최선의 결과를 보장하지는 않으므로 문제 상황에 따라 적절히 사용해야 합니다.

 

데이터의 종류와 크기, 그리고 문제 상황에따라 가장 적합한 알고리즘을 선택하여 사용함으로써 성능 개선과 시간 절약이 가능합니다.

 

그리디 알고리즘은 간단하면서도 강력한 해결 방법이지만, 그것이 항상 최적의 해를 제공하는 것은 아닙니다. 때로는 그리디 알고리즘이 주어진 문제에 대해 최적의 해를 찾지 못하는 경우도 있습니다. 이런 상황에서는 다른 알고리즘, 예를 들어 동적 프로그래밍 등을 고려해볼 수 있습니다.

 

또한, 그리디 알고리즘이 효과적인 경우에는 문제 자체가 그리디 속성(탐욕스러운 선택 속성과 최적 부분 구조) 가져야 합니다. , 단계에서 최선의 선택이 전체적으로도 최선의 결과를 보장하며, 문제의 해결 방법이 작은 부분 문제들의 해결 방법으로부터 도출될 있는 경우입니다.

 

그리디알고리즘은 많은 종류의 문제에서 유용하게 사용됩니다. 예를 들어 네트워크 라우팅, 데이터 압축 분할 가능 배낭 문제와 같은 다양한 최적화 문제에서 그리디 기법이 적용됩니다.

728x90
반응형