알고리즘
백준 15903번 카드 합체 놀이 (JAVA)
박카스마시며코딩
2023. 7. 4. 20:43
https://www.acmicpc.net/problem/15903
15903번: 카드 합체 놀이
첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,
www.acmicpc.net
저는 우선순위 큐를 이용해 문제를 해결하였습니다.
우선순위 큐를 통해 작은 값 두개를 가져오고 이 값을 합하여 다시 우선순위 큐에 넣어주어 문제를 해결하였습니다.
총 카드의 합이기 때문에 작은 값 두개를 합해야한다고 생각했습니다.
만약 카드가 1개라면 그 카드를 바로 리턴하도록 하였습니다.
package BOJ.greedy;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_15903 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
StringTokenizer st = new StringTokenizer(br.readLine());
int n = stoi.apply(st.nextToken());
int m = stoi.apply(st.nextToken());
st = new StringTokenizer(br.readLine());
long[] input = new long[n];
for(int i = 0 ; i < n ; i++){
input[i] = stoi.apply(st.nextToken());
}
long result = cal(input,n,m);
System.out.println(result);
}
private static long cal(long[] input, int n, int m) {
if(n == 1){
return input[0];
}
PriorityQueue<Long> pq = new PriorityQueue<>();
for(int i = 0 ; i < n ; i++){
pq.offer(input[i]);
}
for(int i = 0 ; i < m ; i++){
long a = pq.poll();
long b = pq.poll();
long temp = a + b;
pq.offer(temp);
pq.offer(temp);
}
long sum = 0;
while(!pq.isEmpty()){
sum += pq.poll();
}
return sum;
}
}