음 보자마자 풀이방법이 떠오른 문제는 아니다. 처음엔 중앙값의 의미를 생각해서 두개씩 추가할때 그 케이스를 나눠서 생각해봤다. 추가되는 두 값을 valueA, valueB라고 하겠다.
이런 아이디어까지 오니까 우선순위큐를 사용해야겠다고 생각했다. 다만, mid보다 작은 그룹은 내림차순, mid보다 큰 그룹은 오름차순을 우선순위로 가져야 한다.
class Solution2696 {
int m;
LinkedList<Integer> list;
Solution2696(int m, LinkedList<Integer> list) {
this.m = m;
this.list = list;
}
LinkedList<Integer> getMidValues() {
LinkedList<Integer> midValues = new LinkedList<>();
PriorityQueue<Integer> preQ = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> postQ = new PriorityQueue<>();
int mid = list.get(0);
midValues.add(mid);
int i = 1;
while (i < m) {
int valueA = list.get(i++);
int valueB = list.get(i++);
if (valueA < mid) preQ.offer(valueA);
else postQ.offer(valueA);
if (valueB < mid) preQ.offer(valueB);
else postQ.offer(valueB);
if ((valueA < mid) && (valueB < mid)) {
postQ.offer(mid);
mid = preQ.poll();
} else if ((valueA > mid) && (valueB > mid)) {
preQ.offer(mid);
mid = postQ.poll();
}
midValues.add(mid);
}
return midValues;
}
}