알고리즘/구현,시뮬
BOJ - 1655 ) 가운데를 말해요
개발자가될수있을까?
2021. 6. 9. 20:56


https://www.acmicpc.net/problem/1655
1655번: 가운데를 말해요
첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
특정한 수열의 숫자가 차례대로 주어질때에, 그 중간의 값을 계속 출력하면 된다.
두 가지 자료구조가 있다고생각하면 편하다, 항상 루트노드에 큰값이 오게 정렬되는 Max Heap과 반대인
Min Heap이 있다고 가정하면 이 둘을 붙였을때 온전한 수열이 된다고 생각한다.

그러면 중간값은 각 루트의 있는 값을 비교해서 선택하면 된다.
우선순위큐가 이러한 구조로 정렬되어있기때문에 사용하면된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
import org.omg.CosNaming.IstringHelper;
public class 가운데를말해요 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
PriorityQueue<Integer> pqMax = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1>o2) {
return 1;
} else if(o1<o2) {
return -1;
} else {
return 0;
}
}
});
PriorityQueue<Integer> pqMin = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1<o2) {
return 1;
} else if(o1>o2) {
return -1;
} else {
return 0;
}
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;++i) {
st = new StringTokenizer(br.readLine());
int now = Integer.parseInt(st.nextToken());
INPUT(pqMax,pqMin,now);
Balance(pqMax,pqMin);
Query(pqMax,pqMin,now,sb);
sb.append("\n");
}
System.out.print(sb.toString());
}
private static void Balance(PriorityQueue<Integer> pqMax, PriorityQueue<Integer> pqMin) {
int sizeMax = pqMax.size();
int sizeMin = pqMin.size();
if(sizeMax==0||sizeMin==0)return;
if(sizeMax>sizeMin) {
pqMin.add(pqMax.poll());
} else if(sizeMin>sizeMax) {
pqMax.add(pqMin.poll());
}
}
private static void Query(PriorityQueue<Integer> pqMax, PriorityQueue<Integer> pqMin, int now, StringBuilder sb) {
if(pqMax.isEmpty()) {
sb.append(pqMin.peek());
return ;
} else {
if(((pqMin.size()+pqMax.size())&1) ==0) {
int left = pqMin.peek(); int right = pqMax.peek();
sb.append(left > right ? right : left);
} else {
if(pqMin.size()>pqMax.size()) {
sb.append(pqMin.peek());
} else {
sb.append(pqMax.peek());
}
}
}
}
private static void INPUT(PriorityQueue<Integer> pqMax, PriorityQueue<Integer> pqMin, int now) {
if(pqMax.isEmpty() && pqMin.isEmpty()) {
pqMin.add(now);
return;
} else if(pqMax.isEmpty()) {
if(pqMin.peek() > now) {
int t = pqMin.poll();
pqMax.add(t);
pqMin.add(now);
} else {
pqMax.add(now);
}
} else {
if(pqMax.peek() < now) pqMax.add(now);
else pqMin.add(now);
}
}
}
