1. 문제
2. 풀이
입력으로 제공된 카드들의 누적합을 최소로 만드는 경우의 수를 만들라는 문제다. 이는 Greedy로 접근이 가능한데 이유는 아래와 같다.
a, b, c, d 총 네 개의 카드 묶음(a < b < c < d)이 있다고 가정해보자. 이 때, 먼저 만든 묶음은 또 다른 카드 묶음과 합쳐져야 하므로 한 번 더 더해져야 함을 의미한다. 즉, 더 큰 카드 묶음을 이용하여 새로운 묶음을 만들수록 큰 수가 중복해서 더해진다는 것을 의미한다. 굳이 큰 묶음인 d를 먼저 비교하여 큰 덩어리의 묶음을 만들어 놓을 이유가 없다는 것이다.
그렇다면 우리는 최대한 작은 묶음들을 다시 합치는 작업들을 진행해야 하고, 이를 위해서는 우선순위 큐(Priority Queue)가 필요함을 알 수 있다.
N개의 묶음이 있을 때, 이를 하나의 묶음으로 만들기 위한 비교연산은 총 (N - 1) 번의 연산이 필요하고, 이를 유념하여 우선순위 큐에 만들어진 새로운 묶음들을 넣으며 작업하면 해결할 수 있다.
3. 소스코드
더보기
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
pq.add(Integer.parseInt(br.readLine()));
}
int cnt = 0;
int tot = 0;
while (!pq.isEmpty()) {
if (cnt == N - 1) break;
int a = pq.poll();
int b = pq.poll();
tot += (a + b);
pq.add(a + b);
cnt++;
}
bw.write(tot + "");
br.close();
bw.close();
}
}
반응형
'Algorithm > 문제풀이' 카테고리의 다른 글
[ 백준 25513번 ] 빠른 오름차순 숫자 탐색 (0) | 2023.03.12 |
---|---|
[ 백준 12887번 ] 경로 게임 (1) | 2023.03.12 |
[ 백준 17144번 ] 미세먼지 안녕! (0) | 2023.03.10 |
[ 백준 15666번 ] N과 M(12) (1) | 2023.03.08 |
[ 백준 2225번 ] 합분해 (0) | 2023.03.06 |