[프로그래머스] 이중우선순위큐 42628 (JAVA)

dia·2024년 1월 19일
0

풀이 방식

  1. 최소힙, 최대힙 생성
  2. 연산 명령어 순회
    2-1. 명령어 0번쨰 자리가 I인 경우, 최소힙/최대힙에 값 추가
    2-2. 명령어가 "D 1"인 경우, 최대힙 상단 값을 이용해 최소힙/최대힙에서 최대값 삭제
    2-3. 명령어가 "D -1"인 경우, 최소힙 상단 값을 이용해 최소힙/최대힙에서 최소값 삭제
  3. 힙이 비어있으면 {0, 0}, 아니면 {최대값, 최소값}을 답으로 함

구현

방법1

부호 전환

import java.util.PriorityQueue;

public class NUM42628 {
    public static void main(String[] args) {
        String[] operations = {"I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"};
        System.out.println(Arrays.toString(solution(operations)));
    }
    public static int[] solution(String[] operations) {
        int[] answer = {};

        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>();

        for (int i = 0; i < operations.length; i++) {
            if (operations[i].charAt(0) == 'I') {
                int data = Integer.parseInt(operations[i].split(" ")[1]);
                minHeap.add(data);
                maxHeap.add(-data);
            }
            else if (!minHeap.isEmpty() && operations[i].equals("D 1")) {
                minHeap.remove(-maxHeap.poll());
            }
            else if (!minHeap.isEmpty() && operations[i].equals("D -1")) {
                maxHeap.remove(-minHeap.poll());
            }
        }

        answer = minHeap.isEmpty() ? new int[] {0, 0} : new int[] {-maxHeap.poll(), minHeap.poll()};

        return answer;
    }
}

방법2

Collections.reverseOrder() 이용

import java.util.Collections;
import java.util.PriorityQueue;

public class NUM42628 {
    public static void main(String[] args) {
        String[] operations = {"I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"};
        System.out.println(Arrays.toString(solution(operations)));
    }
    public static int[] solution(String[] operations) {
        int[] answer = {};
        PriorityQueue<Integer> minHeap = new PriorityQueue();
        PriorityQueue<Integer> maxHeap = new PriorityQueue(Collections.reverseOrder());

        for(int i = 0; i < operations.length; i++) {
            if(operations[i].charAt(0) == 'I') {
                minHeap.offer(Integer.parseInt(operations[i].split(" ")[1]));
                maxHeap.offer(Integer.parseInt(operations[i].split(" ")[1]));
            }
            else if(operations[i].equals("D 1")) { minHeap.remove(maxHeap.poll()); }
            else { maxHeap.remove(minHeap.poll()); }
        }

        answer = minHeap.isEmpty() ? new int[]{0, 0} : new int[]{maxHeap.peek(), minHeap.peek()};

        return answer;
    }
}

*다른 분들의 코드를 참고하여 작성했습니다

profile
CS 메모장

0개의 댓글