자두의 데브로그

[자바] 백준 11286번 절댓값 힙 본문

코딩테스트/Java

[자바] 백준 11286번 절댓값 힙

왕자두 2024. 10. 9. 17:54

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

 

이 문제. 정말,. 이제야 우선순위큐를 이해한 사람에게 너무 많은 걸 요구하는 문제라고 생각이 되지만... 어쨋든 우선순위의 기준을 커스텀 해야된다는 거 알고 이것저것 만져봤다는 거에서 그나마 위안을 얻는다^^ 

이 풀이를 작성하면서 가장 이해 안됐던 것이 compare 내부에서 어떤 식으로 구현해야되는지 였는데 다시 생각해보니 원래 PriorityQueue의 순서는 숫자가 작은 것부터 큰 순서대로 출력하니까, 디폴트가 이 설정이라고 생각하고, 절댓값이 같은 경우에 대해서는 음수가 저장되게 하고(즉 원래의 값 비교), 다른 경우에는 절댓값이 작은 게 먼저 오도록 하는 설정을 하면 된다. 이해 안되면 그냥 compare 함수를 통으로 외워버리기~

 

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

class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        PriorityQueue<Integer> pr = new PriorityQueue<>(new Comparator<Integer>(){
            @Override
            public int compare(Integer a, Integer b){
                if(Math.abs(a) == Math.abs(b)) return a - b;
                return Math.abs(a) - Math.abs(b);
            }
        });
        int n = Integer.parseInt(br.readLine());
        for(int i = 0; i < n; i++){
            int x = Integer.parseInt(br.readLine());
            if(x != 0) pr.add(x);
            else{
                if(pr.isEmpty()) sb.append(0);
                else sb.append(pr.poll());
                sb.append("\n");
            }
        }
        System.out.println(String.valueOf(sb));
    }
}

 

쉽지 않네...