Algorithm/백준

중앙값 구하기

whyWhale 2023. 3. 11.

문제 설명

어떤 수열을 읽고, 홀수번째 수를 읽을 때 마다, 지금까지 입력받은 값의 중앙값을 출력하는 프로그램을 작성하시오.

예를 들어, 수열이 1, 5, 4, 3, 2 이면, 홀수번째 수는 1번째 수, 3번째 수, 5번째 수이고, 1번째 수를 읽었을 때 중앙값은 1, 3번째 수를 읽었을 때는 4, 5번째 수를 읽었을 때는 3이다.

홀수 숫자 아니고 홀수 번째이다.

TRY

지속적으로 정렬하면서 체크했지만 FAIL

풀이

두 개의 우선순위 큐를 이용한 풀이 [MaxHeap, MinHeap]

  • MaxHeap에는 큰 숫자를 넣는 것이 아니라 작은 숫자를 넣어줌(중간에 스왑 과정이 있음)

 

public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

		int repeat = Integer.parseInt(reader.readLine());
		StringBuilder answer = new StringBuilder();

		for (int i = 0; i < repeat; i++) {

			PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
			PriorityQueue<Integer> minHeap = new PriorityQueue<>();

			int n = Integer.parseInt(reader.readLine());
			int totalCount = n / 2 + 1;
			answer.append(totalCount).append("\n");
			List<Integer> results = new ArrayList<>();
			StringTokenizer st = new StringTokenizer(reader.readLine());

			for (int j = 0; j < n; j++) {
				if (j!=0 && j % 10 == 0) {
					st = new StringTokenizer(reader.readLine());
				}

				int val = Integer.parseInt(st.nextToken());

				if (maxHeap.size() == minHeap.size()) {
					maxHeap.offer(val);
				} else {
					minHeap.offer(val);
				}

				if (!minHeap.isEmpty()) {
					if (maxHeap.peek() > minHeap.peek()) {
						int t1 = maxHeap.poll();
						int t2 = minHeap.poll();

						maxHeap.offer(t2);
						minHeap.offer(t1);
					}
				}

				if (j % 2 == 0) {
					results.add(maxHeap.peek());
				}
			}

			for (int j = 0; j < results.size(); j++) {
				if (j!=0 && j % 10 == 0) {
					answer.append("\n").append(results.get(j)).append(" ");
				} else {
					answer.append(results.get(j) + " ");
				}
			}

			answer.append("\n");
		}

		System.out.println(answer);
	}

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

백준 - 미세먼지 안녕!  (0) 2023.03.13
마법사 상어와 비바라기  (1) 2023.03.12
데이터 체커  (0) 2023.03.09
괄호 제거  (0) 2023.03.09
백준 - 퇴사  (0) 2023.02.12

댓글