https://www.acmicpc.net/problem/2696
2696번: 중앙값 구하기
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스의 첫째 줄에는 수열의 크기 M(1 ≤ M ≤ 9999, M은 홀수)이 주어지고, 그 다음 줄부터 이 수열의 원소가 차례대로 주
www.acmicpc.net
저는 해당 문제를 우선순위 큐 두개를 이용해 문제를 해결하였습니다.
먼저 작은 것들 중에 가장 큰 값을 루트로 가지는 우선순위 큐(1)와 큰 값들 중에 작은 값을 루트로 가지는 우선순위 큐(2) 두개를 사용했습니다.
처음에는 우선순위 큐(1)에 값을 넣고 그 다음부터는 해당 값이 우선순위 큐(1)의 루트 값 보다 크다면 다른 우선 순위 큐에 넣었습니다.
그리도 홀수 일때마다 둘의 사이즈를 비교하여 둘이 사이즈가 우선순위 큐(1)이 하나 더 크게 될 때까지 교환하였습니다.
마지막으로 이때의 우선순위 큐 (1)의 값을 출력해주었습니다.
시간복잡도 : O(nlog(n))
package BOJ.ETC;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2696 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
int test = stoi.apply(st.nextToken());
for(int t= 0 ; t < test ; t++){
PriorityQueue<Integer> min = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> max = new PriorityQueue<>();
int n = stoi.apply(br.readLine());
System.out.println(n/2 + n%2);
int[] input = new int[n];
for(int i = 0 ; i <= n / 10 ; i++){
st = new StringTokenizer(br.readLine()," ");
for(int j = 0 ; j < 10 && 10 * i + j < n ; j++){
int num = stoi.apply(st.nextToken());
if(min.size() == 0){
min.offer(num);
System.out.print(num+" ");
continue;
}
if(min.peek() < num){
max.offer(num);
}else{
min.offer(num);
}
if(j % 2 == 0){
while(min.size() - 1 != max.size()){
// System.out.println(min.size()+" "+max.size());
if(min.size() - 1 > max.size()){
max.offer(min.poll());
}else{
min.offer(max.poll());
}
}
System.out.print(min.peek()+" ");
}
}
}
System.out.println();
}
}
}
'알고리즘' 카테고리의 다른 글
백준 2018번 수들의 합 5 (JAVA) (0) | 2022.04.16 |
---|---|
백준 1918번 후위 표기식 (JAVA) (0) | 2022.04.15 |
백준 2211번 네트워크 복구 (JAVA) (0) | 2022.04.13 |
프로그래머스 리틀 프렌즈 사천성 (JAVA) (0) | 2022.04.12 |
백준 21609번 상어중학교 (JAVA) (0) | 2022.04.11 |