Algorithm

백준_가운데를 말해요_1655

Young_J 2021. 2. 14. 23:32

// 알고리즘

 

1. 자료구조활용 문제

 

2. 우선순위큐 사용

 - 중간값을 구하기 위해 min우선순위큐와 max우선순위큐 2개 사용

 - 우선순위큐의 크기가 같으면 두개의 peek값을 비교하여 값 선정 

 - min의 peek 값과 max의 peek값을 비교하여 min 값이 더 작으면 자리교체

 

3. StringBuilder에 max.peek 값 저장 

더보기
import java.util.*;
import java.io.*;

public class 가운데를말해요_1655 {
	static int N;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		PriorityQueue<Integer> max = new PriorityQueue<>((o1, o2) -> o2 - o1);
		PriorityQueue<Integer> min = new PriorityQueue<>();
		StringBuilder sb = new StringBuilder();

		max.add(Integer.parseInt(br.readLine()));
		sb.append(max.peek() + "\n");

		for (int i = 0; i < N - 1; i++) {
			int num = Integer.parseInt(br.readLine());

			if (min.size() == max.size()) max.add(num);
			else min.add(num);
			if (search(max.peek(), min.peek(), sb)) {
				int m = min.poll();
				int n = max.poll();
				max.add(m);
				min.add(n);
			}
			sb.append(max.peek() + "\n");
		}

		System.out.println(sb.substring(0, sb.length() - 1).toString());

	}

	private static boolean search(Integer maxNum, Integer minNum, StringBuilder sb) {
		if (maxNum > minNum) {
			return true;
		} else {
			return false;
		}
	}

}

 

※ 출력을 한 번에 하지 않고 매번 System.out.print를 했더니 계속 시간초과가 나는거였음... 출력도 신경써서 해야할거같음.