[백준] 11286번(Java)

나무나무·2025년 1월 6일

백준_코테

목록 보기
12/35

📖 절댓값 힙

[ 문제 ]
절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.

1. 배열에 정수 x (x ≠ 0)를 넣는다.
2. 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.


💡풀이

  • 해당 문제에서 Comparator 인터페이스의 메서드인 compare를 커스터마이징해서 문제를 풀었다.
  • 입력 받은 두 Integer 값의 절댓값을 비교해서 절댓값이 큰 수가 우선순위를 갖고, 만약 절댓값이 동일한 경우 절댓값을 씌우지 않은 원래 값을 비교해서 우선순위를 설정하도록 만들었다.


package heap;

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

public class bj11286 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        //우선순위 큐의 커스터마이징 방법 -> Comparator 사용하기
        Queue<Integer> ans = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                int A = Math.abs(o1);
                int B = Math.abs(o2);

                if(A > B){
                    return A - B;
                } else if(A == B){
                    if(o1 > o2){
                        return 1;
                    } else {
                        return -1;
                    }
                } else{
                    return -1;
                }
            }
        });


        for (int i = 0; i < N; i++) {
            int x = Integer.parseInt(br.readLine());
            if( x == 0){
                if(ans.isEmpty()){
                    System.out.println(0);
                } else{
                    System.out.println(ans.remove());
                }
            } else {
                ans.add(x);
            }
        }
    }
}


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

profile
백엔드 개발자 나무입니다

0개의 댓글