λ¬Έμ
νμ΄
1οΈβ£ μ°μ μμ ν λκ°λ₯Ό νμ©ν νμ΄
π‘ λ μ€λ₯Έ Idea
μ°μ μμ νλ μ΄μ§ ν λ°©μμΌλ‘ ꡬμ±λμ΄ μκΈ° λλ¬Έμ, μ¬μ©νλ©΄ μ λ ¬μ μ μ§ν μ½μ κ³Όμ μ O(logN) μ μνν μ μλ€.
κ·Έλ¦¬κ³ , μ°μ μμ νμ λ°λΌ μ λ ¬λ λ°μ΄ν°λ₯Ό κΊΌλΌ λ μμ, O(logN) λ‘ μνν μ μλ€.
λ°λΌμ μ°μ μμ νλ₯Ό μ¬μ©νλκ² μκ° λ³΅μ‘λλ₯Ό λ§μ‘±μν¬ μ μλ€κ³ νλ¨νμλ€.
κ°μ΄λ° μλ₯Ό νμ λ§ν΄μΌ νλ―λ‘,
λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬λ μ°μ μμ ν (left
) μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λ μ°μ μμ ν(right
) 2κ°λ₯Ό νμ©νλ€.left
μλ μ§κΈκΉμ§ λ°±μ€μ΄κ° μΈμΉ μμ κ°μ μ€ λ΄λ¦Όμ°¨μμΌλ‘ μ λ°μ λ£μ κ²μ΄κ³right
μλ λλ¨Έμ§ μλ€μ μ€λ¦μ°¨μμΌλ‘ λ£μ κ²μ΄λ€.
κ·Έλ¦¬κ³ λ§€λ²left
μpeek()
νμ λ λμ¨ μλ₯Ό λ°ννλ©΄ λλ€.
λ°±μ€μ΄κ° μλ₯Ό μΈμ³€μ λ
1.left
νκ° λΉμ΄μλ κ²½μ°
→left
νμ μΌλ¨ μ½μ νλ€. μ΄μ λ μμκ° νκ°μΌ λ,left
μpeek
ν κ°μ΄ κ°μ΄λ° κ°μ΄ λλ€.
2. κ·Έ μΈ, κ²½μ°
→ λ°±μ€μ΄κ° λΆλ₯Έ μκ°left
νμ μ΅λκ°λ³΄λ€ μμΌλ©΄left
νμ λ£κ³ ν¬λ€λ©΄right
νμ λ£λλ€.
3. λ°±μ€μ΄κ° μλ₯Ό λΆλ₯΄κ³ λμ 2λ² κ³Όμ λ°λΌ νμ μ§μ΄λ£μ ν
→left
νμ ν¬κΈ°κ°right
νμ ν¬κΈ° +1 μ΄μμΌλ‘ λ°κΏμ€λ€.
ex)left = [ 3 ]
,right = [ ]
, λΆλ₯Έ μ =2
→left = [ 2, 3 ]
,right = [ ]
→ 3λ² κ³Όμ κ±°μΉκΈ°
→left = [ 2 ]
,right = [ 3 ]
4. μ κ³Όμ μ κ±°μΉκ³left
μpeek
κ°μ λ°ννλ©΄ κ°μ΄λ° κ°μ΄ λλ€.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> left = new PriorityQueue<>((a, b) -> b - a);
PriorityQueue<Integer> right = new PriorityQueue<>();
StringBuilder ans = new StringBuilder();
while (N-- > 0) {
int n = Integer.parseInt(br.readLine());
// left νκ° λΉμ΄μμΌλ©΄ left νμ μΆκ°
if (left.isEmpty()) {
left.offer(n);
} else {
Integer maxOfLeft = left.peek();
// left νμ μ΅λκ°λ³΄λ€ μμΌλ©΄ left νμ μΆκ°
if (maxOfLeft >= n) {
left.offer(n);
// left νμ μ΅λκ°λ³΄λ€ ν¬λ©΄ right νμ μΆκ°
} else {
right.offer(n);
}
}
// left νμ right ν μ¬λ°°μΉ
arrangeQueueSize(left, right);
ans.append(left.peek() + "\n");
}
System.out.println(ans);
}
private static void arrangeQueueSize(PriorityQueue<Integer> left, PriorityQueue<Integer> right) {
int sizeOfLeft = left.size();
int sizeOfRight = right.size();
// μΌμͺ½ ν λ³΄λ€ μ€λ₯Έμͺ½ νκ° λ ν° κ²½μ°, μΌμͺ½ νλ‘ μ΄λ
if (sizeOfLeft < sizeOfRight) {
left.offer(right.poll());
} else {
// μΌμͺ½ νκ° μ€λ₯Έμͺ½ ν ν¬κΈ° + 1 λ³΄λ€ ν°κ²½μ° μ€λ₯Έμͺ½ νλ‘ μ΄λ
if (sizeOfLeft > sizeOfRight + 1) {
right.offer(left.poll());
}
}
}
}
κ²°κ³Ό
λ Όλ¦¬λ₯Ό μ μΈμ°κ³ κ·Έμ λ§μΆ° ꡬνμ νλλ μ ν΄κ²°ν μ μμλ κ² κ°λ€.