센티는 거인의 나라에서 자신보다 키가 큰 거인들을 마법의 뿅망치로 처리하려 한다. 뿅망치 사용 규칙은 아래와 같다.
처음에는 배열을 사용해 거인의 키를 관리하고, 매번 정렬하여 최댓값을 찾아 처리하는 방식으로 접근했었다. 하지만 역시나 시간초과가 걸려있었기에 이 방식은 사용이 불가능했다. 매번 배열 정렬이 필요하므로 O(N log N)의 시간이 소요된다.
우선순위 큐는 최댓값/ 최솟값을 효율적으로 가져올 수 있는 자료구조이다.
import java.io.*;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int N = Integer.parseInt(input[0]);
int Hcenti = Integer.parseInt(input[1]);
int T = Integer.parseInt(input[2]);
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
for (int i = 0; i < N; i++) {
pq.add(Integer.parseInt(br.readLine()));
}
int hammerUsed = 0;
while (!pq.isEmpty() && hammerUsed < T) {
int tallest = pq.poll();
if (tallest < Hcenti) break;
if (tallest == 1) {
pq.add(tallest);
break;
}
pq.add(tallest / 2);
hammerUsed++;
}
int tallestAfter = pq.isEmpty() ? 0 : pq.peek();
if (tallestAfter < Hcenti) {
System.out.println("YES");
System.out.println(hammerUsed);
} else {
System.out.println("NO");
System.out.println(tallestAfter);
}
}
}