본문 바로가기
알고리즘/BAEKJOON

[백준] 11509 풍선 맞추기 (Java)

by kyeee2 2022. 5. 20.

[11509 풍선 맞추기]

난이도: 골드5

 

11509번: 풍선 맞추기

첫 번째 예제 에서 [5,4,3] 을 터트리고 [2,1]을 터트리면 모든 풍선을 터트릴 수 있으므로 최소한 2개의 화살을 필요로 한다.

www.acmicpc.net

문제

 
입력

출력


[아이디어]

처음에는 남아있는 풍선 중 가장 높이 있는 풍선의 높이를 찾아주기 위해 풍선들을 모두 탐색하려고 하였다. 하지만 풍선의 개수가 100만개이므로 모든 풍선이 다 터질 때까지 계속 반복하면 시간초과가 난다. 따라서 풍선 중 가장 높이 있는 높이를 구해주기 위해 우선순위 큐를 사용하였다.


[JAVA 코드]

import java.io.*;
import java.util.*;

public class Main {
	
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	
	static int N, result;
	static int [] balloon;
	static boolean [] visited;
	static PriorityQueue<Balloon> pQ = new PriorityQueue<>();
	
	static class Balloon implements Comparable<Balloon> {
		int height, idx;
		
		public Balloon(int h, int i) {
			this.height = h;
			this.idx = i;
		}

		@Override
		public int compareTo(Balloon o) {
			return Integer.compare(this.height, o.height) * -1;
		}
	}

	public static void main(String[] args) throws IOException {
		N = Integer.parseInt(br.readLine());

		balloon = new int [N];
		tokens = new StringTokenizer(br.readLine());
		for(int i = 0; i < N; i++) {
			balloon[i] = Integer.parseInt(tokens.nextToken());
			pQ.offer(new Balloon(balloon[i], i));
		}

		visited = new boolean [N];
		int cnt = 0; // 터진 풍선 개수
		while(!pQ.isEmpty()) {
			int h = pQ.peek().height;
			int idx = pQ.poll().idx;
			
			if(visited[idx]) continue;
			result++;
			
			for(int i = idx; i < N; i++) {
				if(balloon[i] == h && !visited[i]) {
					h--;
					cnt++;
					visited[i] = true;
				}
				if(h == 0) break;
			}
			
			// 풍선 다 터뜨린 경우
			if(cnt == N) break;
		}
		
		System.out.println(result);
	}

}

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

[백준] 11653 소인수분해 (Java)  (0) 2022.05.26
[백준] 2580 스도쿠 (Java)  (0) 2022.05.21
[백준] 15681 트리와 쿼리 (Java)  (0) 2022.05.20
[백준] 17141 연구소2 (Java)  (0) 2022.05.20
[백준] 21924 도시건설 (Java)  (0) 2022.05.14

댓글