본문으로 바로가기

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

 

1655번: 가운데를 말해요

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

www.acmicpc.net

 

 

입력 값이 계속 주어질 때 해당 숫자의 가운데 값을 출력하는 문제 

 

우선순위 큐를 2개 사용해서 하나는 내림차순(max heap), 하나는 오름차순 (min heap) 으로 사용해서 해결했다. 


 

풀이

1. 우선 주어진 입력 값을 숫자에 상관없이 큐에 번갈아가면서 추가한다. 

2. 출력은 max heap 의 루트 값을 출력하기에 max heap 에 있는 값은 min heap 에 있는 값보다 작아야 한다. 

3. 우선순위 큐를 넣고 마지막에 min heap 에 있는 값과 max heap 에 있는 값을 비교하여 재정렬 해준다. 

 

*주의

N 값이 크기 때문에 바로바로 출력하면 시간초과 난다. 

StringBuilder를 사용하도록 하자 

 

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


public class Main {
    
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        Queue<Integer> queue1 = new PriorityQueue<>(Collections.reverseOrder());
        Queue<Integer> queue2 = new PriorityQueue<>();
        
        StringBuilder builder = new StringBuilder();
        
        for (int i = 0; i<n; i++) {
            int tmp = Integer.parseInt(reader.readLine());
            
            if (queue1.size() == queue2.size()) {
                queue1.add(tmp);
            } else {
                queue2.add(tmp);
            }
            
            if (queue1.size() > 0 && queue2.size() > 0 && queue1.peek() > queue2.peek()) {
                int tmp1 = queue1.poll();
                int tmp2 = queue2.poll();
                queue1.add(tmp2);
                queue2.add(tmp1);
            }
            
            builder.append(queue1.peek()).append("\n");
        }
        System.out.println(builder);
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2749번. 피보나치 수 3 (Java)  (0) 2023.06.07
[백준] 9471번 피사노 주기  (0) 2023.06.07
[백준] 1303번 전쟁 - 전투 (Java)  (0) 2023.03.09
[백준] 1629번 곱셈  (0) 2023.02.08
[백준] 1309번 : 동물원  (0) 2023.01.19