🟦/백준

[실버 1] 절댓값 힙

진뚱이용 2023. 4. 4. 20:49

https://www.acmicpc.net/problem/11286

 

11286번: 절댓값 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

minHeap의 데이터를 Integer가 아닌 Data class {절댓값, 부호}로 해보자

 

minHeap 선언할 때 재정의가 필요하다

 

절댓값 작은 순서가 우선순위)

같을 경우 -부호가 +부호 보다 우선순위)

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

class Data {
    int absolute_value;
    int sign;

    Data(int absolute_value, int sign) {
        this.absolute_value = absolute_value;
        this.sign = sign;
    }
}

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N;

        PriorityQueue<Data> minHeap = new PriorityQueue<>(new Comparator<Data>() {
            @Override
            public int compare(Data o1, Data o2) {
                if (o1.absolute_value == o2.absolute_value)
                    return o1.sign;
                return o1.absolute_value - o2.absolute_value;
            }
        });

        N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            int x = Integer.parseInt(br.readLine());
            if (x == 0) {
                if (minHeap.isEmpty())
                    sb.append("0\n");
                else {
                    Data tmp = minHeap.remove();
                    if (tmp.sign < 0)
                        tmp.absolute_value = -tmp.absolute_value;

                    sb.append(tmp.absolute_value+"\n");
                }

            } else {
                if (x > 0)
                    minHeap.add(new Data(x, 1));
                else
                    minHeap.add(new Data(-x, -1));
            }

        }

        System.out.println(sb);
    }
}