본문 바로가기

알고리즘/BAEKJOON

19638 센티와 마법의 뿅망치_Heap

19638번: 센티와 마법의 뿅망치 (acmicpc.net)

 

19638번: 센티와 마법의 뿅망치

마법의 뿅망치를 센티의 전략대로 이용하여 거인의 나라의 모든 거인이 센티보다 키가 작도록 할 수 있는 경우, 첫 번째 줄에 YES를 출력하고, 두 번째 줄에 마법의 뿅망치를 최소로 사용한 횟수

www.acmicpc.net

package Heap;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Baekjoon_19638_센티와마법의뿅망치 {

	static class Node implements Comparable<Node>{
		int x;
		
		public Node(int x) {
			this.x = x;
		}

		@Override
		public int compareTo(Node o) {
			return o.x - this.x; // 내림차순 정렬
		}
	}
	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int N = Integer.parseInt(st.nextToken()); // 인구 수
		int H = Integer.parseInt(st.nextToken()); // 센티의 키
		int T = Integer.parseInt(st.nextToken()); // 뿅망치 회수
		PriorityQueue<Node> pq = new PriorityQueue<>();
		
		for(int i = 0 ; i <N; i++) {
			int a = Integer.parseInt(br.readLine());
			pq.offer(new Node(a));
		}
		
        // 뿅망치를 사용할 수 있는 횟수만큼 for문을 돌린다.
		int cnt = 0;
		for(int i = 0; i < T; i++) {
       		 // pq에서 가장 큰게 H보다 작으면 더이상 볼 필요가 없다.
			if(pq.peek().x < H) break; // 이 부분을 깜빡해서 계속 틀렸었다.
			if(pq.peek().x == 1) continue; // 1이면 나누는 과정 필요 없다.
			
			Node node = pq.poll();
			int height = node.x/2;
			
			cnt++;
			pq.offer(new Node(height));
		}
		
		for(int i = 0; i < pq.size(); i++) {
			int height = pq.poll().x;
			if(height >= H) {
				System.out.println("NO");
				System.out.println(height);
				return;
			}
			else {
				System.out.println("YES");
				System.out.println(cnt);
				return;
			}
		}

	}
}

 

'알고리즘 > BAEKJOON' 카테고리의 다른 글

2417 정수 제곱근_Binary Search  (0) 2021.07.12
19598 최소 회의실 개수  (0) 2021.07.11
11279 최대 힙_Heap  (0) 2021.07.08
14621 나만 안되는 연애_Prim  (0) 2021.07.06
1197 최소 스패닝 트리_Kruskal  (0) 2021.07.05