본문 바로가기
알고리즘

백준 1665번 가운데를 말해요 (java)

by 창따오 2023. 12. 4.
728x90

출처 : https://www.acmicpc.net/problem/1655

소소코드

package baekjoon;

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

public class Baek1655 {
    static PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    static PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,b)->b-a); //큰값을 root값으로
    static int n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(br.readLine());
            if (minHeap.size() == maxHeap.size()) {
                maxHeap.add(num);
                if (minHeap.size() != 0 && minHeap.peek() < maxHeap.peek()) {
                    maxHeap.add(minHeap.poll());
                    minHeap.add(maxHeap.poll());
                }
            }else{
                minHeap.add(num);
                if (maxHeap.peek() > minHeap.peek()) {
                    minHeap.add(maxHeap.poll());
                    maxHeap.add(minHeap.poll());
                }
            }
            sb.append(maxHeap.peek()).append("\n");
        }
        System.out.println(sb.toString());
    }

}

느낀점

-> PriorityQueue를 이렇게 창의적으로 이어붙어서 사용할 수 있구나? 처음에는 PriorityQueue가 get()메소드를 가지고있다 생각하고 하나의 PriorityQueue를 사용하여 중간 index값을 반환하는 식으로 풀이를 진행하였다... 하지만 get() 메소드가 없다는 것을 인지했고, 생각하다가 PriorityQueue를 이어붙인 느낌으로 구현하였다. 정말 참신하고 재미있는 문제이다.