본문 바로가기
알고리즘

그리디(greedy)

by hxxyeoniii 2024. 10. 1.

그리디 알고리즘

현재 상태에서 보는 선택지 중 최선의 선택지가 전체 선택지 중 최선의 선택지라고 가정

 

1. 해 선택 : 현재 상태에서 가장 최선이라고 생각되는 해를 선택

2. 적절성 검사 : 현재 선택한 해가 전체 문제의 제약 조건에 벗어나지 않는지 검사

3. 해 검사 : 현재까지 선택한 해 집합이 전체 문제를 해결할 수 있는지 검사

-> 전체 문제를 해결하지 못한다면 1로 돌아가 과정 반복


백준 온라인저지 11047번

import java.util.Scanner;

public class P11047_동전개수의최솟값구하기 {

    /**
     * 그리디 알고리즘 : 항상 최적의 해를 보장하지는 않음
     * 문제 분석이 중요함!
     * 이번 문제에서는 동전 가격이 서로 배수가 되므로 반례가 생기지 않아 그리디 알고리즘에 적합함
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();

        int arr[] = new int[N];
        for(int i=0; i<N; i++) {
            arr[i] = sc.nextInt();
        }

        // 최대한 큰 동전부터 사용
        int count = 0;
        for(int i=N-1; i>=0; i--) {
            if(arr[i] <= K) {
                count += (K/arr[i]);
                K = K % arr[i]; // 현재 동전을 사용하고 남은 금액
            }
        }
        System.out.println(count);
    }
}

백준 온라인저지 1931번

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class P1931_회의실배정하기 {
    public static void main(String[] args) {
        // 현재 회의 종료시간이 빠를수록 더 많은 회의를 진행할 수 있음 -> 그리디
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt(); // 회의 개수
        int[][] arr = new int[N][2];

        for(int i=0; i<N; i++) {
            int s = sc.nextInt(); // 회의 시작시간
            int e = sc.nextInt(); // 회의 종료시간

            arr[i][0] = s;
            arr[i][1] = e;
        }

        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] arr1, int[] arr2) {
                if(arr1[1] == arr2[1]) {
                    return arr1[0] - arr2[0];
                }
                return arr1[1] - arr2[1];
            }
        });

        int answer = 0;
        int end = -1;
        for(int i=0; i<N; i++) {
            if(arr[i][0] >= end) {
                end = arr[i][1];
                answer++;
            }
        }
        System.out.println(answer);
    }
}

'알고리즘' 카테고리의 다른 글

소수 구하기 : 에라토스테네스의 체 원리  (0) 2024.10.20
Comparator와 Comparable  (0) 2024.10.14
이진 탐색(binary search)  (1) 2024.09.19
BFS(넓이 우선 탐색)  (0) 2024.09.03
DFS(깊이 우선 탐색)  (2) 2024.08.28