[백준] 11286번 절댓값 힙 (java)

0

코딩테스트

목록 보기
10/37
post-thumbnail

<문제>

문제 출처 : https://www.acmicpc.net/problem/11286

<나의 풀이>

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

public class 절대값힙_11286 {
    public static void main(String[] args) throws IOException {
        // 우선순위 큐 & 우선순위 정렬 기준 커스텀
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));    // 들어오는 데이터가 많을 경우, scanner보다 시간복잡도 면에서 유리함
        int N = Integer.parseInt(br.readLine());
        // 우선순위 큐 정의
//        PriorityQueue<Integer> myQueue = new PriorityQueue<>(); 보통은 이렇게 끝인데 우선순위 정렬기준 커스텀이 필요함.
// 정렬기준 커스텀 방법이 이해가 안된다. 우선순위큐의 우선순위 지정해주는 방법과 우선순위 큐가 뭔지.. 개념도 좀 알아야되겠다.
        PriorityQueue<Integer> q = 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 num = Integer.parseInt(br.readLine());
            if (num == 0){
                if (q.isEmpty()){
                    System.out.println("0");
                }else {
                    System.out.println(q.poll());
                }
            }else {
                q.offer(num);
            }


        }
    }
}

<핵심 개념>

풀이를 떠올리는게 어렵진 않았지만 구현하는게 너무 어려웠다. 문제를 이해하긴 했는데 큐를 어떻게 정렬하지? 고민하다가 안풀려서 결국 풀이를 참고했는데 우선순위 큐를 모르는것도 문제였고, 우선순위 큐의 정렬 기준을 커스텀 해주는 것도 처음이라 설명을 보고도 아직도 잘 모르겠다.
따로 공부를 더 해보면서 몇 번 복습을 해봐야 될 것 같다.

<참고 자료>

https://velog.io/@april_5/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90Priority-Queue
https://kyumq.tistory.com/23
https://dragon-h.tistory.com/3

profile
두둥탁 뉴비등장

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

가치 있는 정보 공유해주셔서 감사합니다.

답글 달기