여니의 취준 준비/코딩테스트 (Java)

[*11286*] 절댓값 힙 in Java

여니's 2022. 8. 12. 12:19

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

 

11286번: 절댓값 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net


접근 방식

- 절댓값을 기준으로 정렬을 해야하는 상황

- 우선순위 큐의 정렬 기준을 변경해줘서 진행해야 하는 문제

 

참고 자료

https://velog.io/@robolab1902/Java-Priority-Queue-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%97%90-%EB%9E%8C%EB%8B%A4%EC%8B%9D-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%AD%90%EC%95%BC

 

[Java] Priority Queue 매개변수에 람다식 쓰는 이유가 뭐야?

Java로 Priority Queue 예제를 풀어보기로 했다. 근데 백준 11286을 푸는데 문제점이 생겼다.문제를 요약하면 다음과 같다.0이 아닌 값이 입력되면 입력되라.0이 입력되면 입력된 값을 출력해라.다만,

velog.io

 

우선순위 큐

// 1. 최소힙 (오름차순 정렬)
PriorityQueue<Integer> minHeap= new PriorityQueue<>();

// 2. 최대힙 (내림차순 정렬)
PriorityQeueu<Integer> maxHeap = new PriorityQueue<>(Collections.reserveOrder());

 

우선순위 큐 정렬 조건 수정하기

Compare 오버라이딩 하기

 

 

 


시행 착오

 

 

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package d0812;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
 
public class Main_11286_7조 {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine()); // 연산의 개수
        
        // 낮은 숫자가 우선 순위인 int형 우선순위 큐 선언
        // 절댓값을 기준으로 정렬을 해줘야 하므로 Compare을 오버라이딩 해서 정렬 기준을 변경해줘야함.
        PriorityQueue<Integer> queue= new PriorityQueue<>((o1,o2)->{
            int num1=Math.abs(o1);
            int num2=Math.abs(o2);
            if(num1==num2) return o1>o2 ? 1:-1;
            return num1-num2;
        });
        
        for (int i = 0; i < n; i++) {
            int temp=Integer.parseInt(br.readLine());
            if (temp!=0) {
                queue.add(temp);
            }else if(temp==0) {
                // 가장 작은 값 출력 후, 제거
                if(queue.isEmpty()) System.out.println("0");
                else System.out.println(queue.poll());
            }
        
        }
        
    }
 
}
/*
1. 배열에 x를 넣는다.
2. 절댓값이 가장 작은 값을 출력,제거 
    여러개일 경우 ->
*/
 
cs