그리디 알고리즘이란 현재 상태에서 보는 선택지 중 최선의 선택지가 전체 선택지 중 최선의 선택지라고 가정하는 알고리즘이다.
그리디 알고리즘의 핵심 이론
- 해 선택: 현재 상태에서 가장 최선이라고 생각되는 해를 선택한다.
- 적절성 검사: 현재 선택한 해가 전체 문제의 제약 조건에서 벗어나지 않는지 검사한다.
- 해 검사: 현재까지 선택한 집합이 전체 문제를 해결할 수 있는지 검사한다. 전체 문제를 해결하지 못한다면 1. 로돌아가 같은 과정을 반복한다.
문제
풀이
먼저 선택된 카드 묶음이 비교 횟수에 더 많은 영향을 미친다. 따라서 카드 묶음의 카드의 개수가 작은 순서대로 먼저 합치는 것이 전체 비교 횟수를 줄일 수 있는 방법이다. 즉, 현재 데이터 중 가장 작은 카드의 개수를 가진 묶음 2개를 ㅃㅂ고 다시 데이터에 넣고 정렬해야한다. 이 문제는 우선순위 큐를 이용하면 편하다.
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = 0; i <n; i++) {
int data = sc.nextInt();
pq.add(data);
}
int data1 = 0;
int data2 = 0;
int sum = 0;
while (pq.size() != 1) {
data1 = pq.remove();
data2 = pq.remove();
sum += data1 + data2;
pq.add(data1 + data2);
}
System.out.print(sum);
}
}
'🤷♂️Algorithm' 카테고리의 다른 글
[정수론] 유클리드 호제법 (0) | 2024.04.11 |
---|---|
[정수론] 소수 구하기 (0) | 2024.04.03 |
[백준 2343] 기타레슨 (이진 탐색) (0) | 2024.03.27 |
[백준 1377] 버블 소트 (버블 정렬) (0) | 2024.03.05 |
[백준 11003] 최솟값 찾기 (슬라이딩 윈도우) (0) | 2024.03.01 |