알고리즘/백준

[백준] 11268 - 자바

삼록이 2025. 7. 21. 11:13

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

 

이 문제의 기준을 보면 까다롭다. 스택이나, 큐처럼 제일 마지막에 들어온 걸 뺀다거나 먼저 들어온걸 먼저 뺀다거나 하는 기준이 아니라, 절댓값이 가장 작은 수를 빼고, 만약에 절댓값이 같다면 두 수중 실제로 작은 수를 빼는 기준이 까다로운 문제다.

이럴 땐, 우선순위 큐를 활용하면 쉽게 풀 수 있다.

 

기본적으로 우선순위 큐는 큐에 들어가는 순간 오름차순 정렬되어 poll하면 가장 작은 수부터 빠져나간다.

그래서 우리는 우리 절댓값 기준으로 오름차순 정렬인데 절대값이 두 수가 있다면 원래 수에서 오름차순으로 정렬할 수 있도록  Comparator를 통한 커스터마이징이 필요하다.


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<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if(Math.abs(o1) == Math.abs(o2)){
                    return o1-o2;
                }
                return Math.abs(o1) - Math.abs(o2);
            }
        });
        StringBuilder sb = new StringBuilder();

        for(int i=0; i<n; i++){
            int var = Integer.parseInt(br.readLine());
            if(var ==0){
                if(pq.isEmpty()){
                    sb.append(0).append("\n");
                } else{
                    sb.append(pq.poll()).append("\n");
                }
            } else{
              pq.add(var);
            }

        }

        System.out.println(sb);



    }
}

 

PriorityQueue는 내부적으로 compare(o1, o2)의 결과를 기반으로
우선순위가 높은 값을 앞으로 (즉, poll() 시 먼저 나오도록) 정렬한다.

return Math.abs(o1) - Math.abs(o2)는 절댓값이 작은 수가 더 우선되도록,
return o1 - o2는 절댓값이 같을 때 실제값이 더 작은 수가 우선되도록 정렬 기준을 설정했다.

이 Comparator를 통해 우리는 문제에서 요구한 “절댓값이 작은 수 우선, 같다면 작은 수 우선”이라는 기준을 우선순위 큐에 그대로 적용할 수 있다.