본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1874번 절댓값 힙

by 현장 2025. 9. 25.

-Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;

public class BOJ11286 {
    public static void main(String[] args) throws IOException {
        // 인풋이 많아서 BufferedReader 사용
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        // 우선순위 큐 선언
        PriorityQueue<Integer> queue = new PriorityQueue<>(
                // 정렬 기준 설정
                (o1, o2) -> {
                    // 절대값 작은 순 정렬
                    int first_abs = Math.abs(o1);
                    int second_abs = Math.abs(o2);
                    // 절대값이 같은 경우 음수 우선 정렬
                    if (first_abs == second_abs) {
                        return o1 > o2 ? 1 : -1;
                    }
                    return first_abs - second_abs;
                }
        );

        for (int i = 0; i < n; i++) {
            int input_num = Integer.parseInt(br.readLine());
            // 인풋이 0인 경우
            if (input_num == 0) {
                // queue가 비어있으면 0 출력
                if (queue.isEmpty()) {
                    System.out.println(0);
                } else {
                    // 0이 아니면 가장 작은 값 출력
                    System.out.println(queue.poll());
                }
            } else {
                queue.add(input_num);
            }
        }

    }
}

예전에 파이썬으로 풀었건 것은 리스트로 절대값과 원래 값을 넣고 힙에 넣으면 해결이 되었지만 자바로 해보니 직접 정렬로직을 구해야해서 해당 부분을 찾아서 하는데 오래 걸렸습니다. 이전에도 Comparator에서 많이 막혔는데 계속 접해봐야 할 것 같습니다.