문제 설명
시퀀스를 읽어 홀수를 읽으면 지금까지 입력한 값의 중앙값을 출력하는 프로그램을 작성하세요.
예를 들어 수열이 1, 5, 4, 3, 2일 때 홀수는 1, 3, 5번째 숫자이고, 1번째 숫자를 읽은 중앙값은 1번째, 3번째 숫자를 읽은 중앙값입니다. 4번째와 5번째 숫자를 읽으면 3입니다.
홀수가 아니라 홀수입니다.
시도
계속해서 확인하고 정리했습니다. 실패하다
설명
두 개의 우선 순위 큐(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);
}
