https://www.acmicpc.net/problem/14235
Problem 💻
문제
크리스마스에는 산타가 착한 아이들에게 선물을 나눠준다. 올해도 산타는 선물을 나눠주기 위해 많은 노력을 하고 있는데, 전세계를 돌아댕기며 착한 아이들에게 선물을 나눠줄 것이다. 하지만 산타의 썰매는 그렇게 크지 않기 때문에, 세계 곳곳에 거점들을 세워 그 곳을 방문하며 선물을 충전해 나갈 것이다. 또한, 착한 아이들을 만날 때마다 자신이 들고있는 가장 가치가 큰 선물 하나를 선물해 줄 것이다.
이제 산타가 선물을 나눠줄 것이다. 차례대로 방문한 아이들과 거점지의 정보들이 주어졌을 때, 아이들이 준 선물들의 가치들을 출력하시오. 만약 아이들에게 줄 선물이 없다면 -1을 출력하시오.
입력
첫 번째 줄에서는 아이들과 거점지를 방문한 횟수 n이 주어진다.(1≤n≤5,000)
다음 n줄에는 a가 들어오고, 그 다음 a개의 숫자가 들어온다. 이는 거점지에서 a개의 풀이풀이푸선물을 충전하는 것이고, 그 숫자들이 선물의 가치이다. 만약 a가 0이라면 거점지가 아닌 아이들을 만난 것이다. 선물의 가치는 100,000보다 작은 양의 정수이다.(1≤a≤100)
출력
a가 0일 때마다, 아이들에게 준 선물의 가치를 출력하시오. 만약 줄 선물이 없다면 -1을 출력하라. 적어도 하나의 출력이 있음을 보장한다.
Solution 💡
이 문제는 힙(Heap) 자료구조를 활용하는 문제이다. 자바의 PriorityQueue
를 사용하여 문제를 해결한다. 문제의 요구사항에 따라 선물의 가치를 기준으로 내림차순 정렬이 필요하며, 이를 위해 PriorityQueue
를 생성할 때 Collections.reverseOrder()
를 사용한다.
풀이과정
- 우선순위 큐 생성
내림차순 정렬을 위한 PriorityQueue는 다음과 같이 생성한다.
PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
- 입력 조건 처리
입력값이 0일 경우와 0이 아닐 경우로 나눠 처리한다.
- 입력값이 0인 경우
- 큐가 비어있으면
-1
출력 - 큐가 비어있지 않으면
poll()
로 가장 큰 값을 출력
- 큐가 비어있으면
- 입력값이 0이 아닌 경우
- 선물 충전소로 선물 값을 큐에 삽입
- 입력값이 0일 경우와 0이 아닐 경우로 나눠 처리한다.
- 입력값이 0인 경우
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
PriorityQueue queue = new PriorityQueue(Collections.reverseOrder());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
if (a == 0) {
if (!queue.isEmpty()) {
sb.append(queue.poll());
}else {
sb.append(-1);
}
sb.append("\n");
continue;
}
for (int j = 0; j < a; j++) {
queue.add(Integer.parseInt(st.nextToken()));
}
}
System.out.println(sb);
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[코딩테스트] 백준 26042번: 식당 입구 대기 줄 - JAVA (0) | 2024.12.03 |
---|---|
[코딩테스트] 백준 9375번 패션왕 신해빈 - JAVA (0) | 2024.12.02 |
[코딩테스트] 백준 19638번 센티와 마법의 뽕망치 - JAVA (0) | 2024.11.30 |
[코딩테스트] 백준 1158번 요세푸스 문제 - JAVA (0) | 2024.11.29 |
[코딩테스트] 백준 10845번 큐 - 자바 (0) | 2024.11.29 |