Algorithm/백준 문제풀이

[백준] 1655번 가운데를 말해요 - Java

너지살 2022. 5. 20. 01:06

 

 

문제출저 : 

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

 

1655번: 가운데를 말해요

첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1

www.acmicpc.net

 

 

소스코드 : 

 

package studyGroup.may.may15;

import java.util.*;
import java.io.*;

/*

중간값 말하기
짝수라면 두 수 중에 작은 수

100,000을 매번 정렬하면 N * N * logn
시간초과가 발생한다.

최대힙과 최소힙을 이용한다.
우선순위큐
https://gh402.tistory.com/32

*/

public class 가운데를말해요1655 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        PriorityQueue<Integer> maxPQ = new PriorityQueue<>(Comparator.reverseOrder());
        PriorityQueue<Integer> minPQ = new PriorityQueue<>();

        for(int i = 0; i < n; i++)
        {
            int number = Integer.parseInt(br.readLine());

            if(maxPQ.size() == minPQ.size())
            {
                maxPQ.add(number);

                // 자리 교체
                if(!minPQ.isEmpty() && maxPQ.peek() > minPQ.peek()) {
                    minPQ.add(maxPQ.poll());
                    maxPQ.add(minPQ.poll());
                }
            }

            else {
                minPQ.add(number);

                // 자리 교체
                if (maxPQ.peek() > minPQ.peek()) {
                    minPQ.add(maxPQ.poll());
                    maxPQ.add(minPQ.poll());
                }
            }



            System.out.println(maxPQ.peek());

        }
    }

}