코딩/코딩테스트

백준 11286번: 절댓값 힙

yesman9 2024. 7. 2. 19:01

이 문제에서는 출력할 때 두 가지 규칙을 갖는다.

  1. 배열에서 절댓값이 가장 작은 수가 우선순위를 갖는다.
  2. 절댓값이 같으면 가장 작은 수가 우선순위를 갖는다.

자바의 PriorutyQueue를 활용하면 쉽게 풀이할 수 있다.

PriorityQueue는 선언할 때, Comparator객체를 이용하여 사용자 정의의 우선순위 규칙을 부여할 수 있다.

https://velog.io/@llocr/Java-Priority-Queue%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90-%EC%99%80-Comparable-Comparator

 

Java | Priority Queue(우선순위 큐) 와 Comparable, Comparator

우선순위 큐는 먼저 들어간 데이터가 먼저 나오는 일반적인 큐와는 다르게 데이터를 꺼낼 때 우선순위가 가장 높은 데이터가 가장 먼자 나온다.우선순위 큐는 힙을 이용하여 구현하는 것이 일

velog.io

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;

public class Main {
	public static void main(String[] args) throws IOException {
		// 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				if (Math.abs(o1) == Math.abs(o2)) {
					return o1 - o2;
				} else {
					return Math.abs(o1) - Math.abs(o2);
				}
			}
		});

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n; i++) {
			// 입력
			int input = Integer.parseInt(br.readLine());
			// 입력이 0인 경우
			if (input == 0) {
				// 입력이 0인데 queue가 비어있으면
				if (queue.isEmpty()) {
					sb.append("0\n");
					continue;
				}
				// 입력이 0이고 queue가 비어있지 않으면
				sb.append(queue.poll() + "\n");
			} else { // 입력이 0이 아닌 경우
				queue.add(input);
			}
		}

		bw.write(sb.toString());
		bw.flush();
		bw.close();
		br.close();
	}

}