그리디(탐욕적) 알고리즘은 문제 해결 과정에서 매 순간마다 가장 좋은 선택을 하는 전략을 말한다. 즉 현재 단계에서 가장 최적이라고 판단되는 해를 선택하고 그 선택이 전체 문제 해결에도 최적이라는 가정하에 최종해에 도달하고자 하는 알고리즘이다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int remain = Integer.parseInt(br.readLine());
// 각 순간마다 500, 100, 50, 10원 순서로 동전을 주는 것이 가장 최적의 선택
int[] coins = new int[] { 500, 100, 50, 10 };
int selectedCoin = 0;
int coinCount = 0;
while (remain > 0) { // 거스름돈의 잔액이 0원보다 많다면 반복
if (selectedCoin >= coins.length) { // 10원으로 나누어떨어지지 않는다면 이 경우 문제를 해결할 수 없음
System.out.println("구할 수 없는 단위의 금액입니다.");
return;
}
coinCount += remain / coins[selectedCoin]; // {500}원부터 차례로 동전 갯수를 더해나감
remain = remain % coins[selectedCoin]; // {500,100,50,10}원으로 거슬러줄 수 없는 나머지 금액을 구함
selectedCoin++; // 다음 코인 선택
}
System.out.println(coinCount);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
long[][] arr = new long[n][2];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = Long.parseLong(st.nextToken());
arr[i][1] = Long.parseLong(st.nextToken());
}
// 가장 종료가 빠른 회의를 선택하되 시작 시간도 가장 빠른 회의를 선택한다. 이를 정렬로 구현
Arrays.sort(arr, Comparator.comparingLong((long[] a)-> a[1]).thenComparingLong(a-> a[0]));
long[] cur = arr[0];
int cnt = 1;
for (int i = 1; i < n; i++) {
if (arr[i][0] < cur[1]) { // 현재 진행중인 회의보다 먼저 시작되는 회의는 선택될 수 없음
continue;
}
cur = arr[i];
cnt++;
}
System.out.println(cnt);
}
이 외에도 최소 신장 트리를 찾는 알고리즘에서 프림 알고리즘, 크루스칼 알고리즘 등이 그리디한 방식으로 간선을 선택한다.
123