-
[KOITP] 중앙값자료구조 및 알고리즘/문제풀이 2017. 1. 12. 08:05
출 처 : http://koitp.org/problem/SDS_PRO_3_6/read/
시간 제한 메모리 제한 제출 횟수 정답 횟수 (비율) 정답자 수 1.1 초 512 MB 1754 452 (26%) 379 < Comment >
풀이를 어느정도 알고도 한참을 풀었습니다. 기본적으로 mid 값을 한쪽에서만 뽑는다고 가정하고 진행을 했어야 조금 더 생각하기 편했을 텐데 이러한 가정없이 양쪽 힙에서 뽑은 숫자 중에 큰값 작은값~~ 라는 식으로 생각하다보니 머리가 복잡해져 더욱 오래 걸렸던 것 같습니다. 아이디어는 심플하나 기존에 알고 있지 못하다면 매우 어려운 문제일 수도 있다고 생각됩니다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.PriorityQueue; public class MiddleNumber { public static int N = 0; public static int arr[] = null; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); N = Integer.parseInt(br.readLine()); PriorityQueue<Integer> minHeap = new PriorityQueue<>(); PriorityQueue<Integer> maxHeap = new PriorityQueue<>(); minHeap.add(Integer.MAX_VALUE); maxHeap.add(Integer.MAX_VALUE); int curr = 0; int mid = Integer.parseInt(br.readLine()); maxHeap.add(-mid); bw.write("" + mid + "\n"); for (int i = 1 ; i < N ; i++) { mid = -maxHeap.peek(); curr = Integer.parseInt(br.readLine()); if (mid >= curr) { maxHeap.add(-curr); } else { minHeap.add(curr); } if (maxHeap.size() - minHeap.size() > 1) { minHeap.add(-maxHeap.poll()); } else if (minHeap.size() - maxHeap.size() > 0) { maxHeap.add(-minHeap.poll()); } mid = -maxHeap.peek(); if (i % 2 == 0) { bw.write("" + mid + "\n"); } } bw.close(); } }