728x90
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
728x90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
final int MOD = 20_171_109;
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int A = Integer.parseInt(st.nextToken());
// 중간값을 기준으로 한 최소 힙 -> 항상 왼쪽에 수가 하나 더 많게 유지
PriorityQueue<Integer> leftPq = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> rightPq = new PriorityQueue<>();
leftPq.add(A);
int result = 0;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int X = Integer.parseInt(st.nextToken());
int Y = Integer.parseInt(st.nextToken());
// X, Y 둘 다 중간값보다 작은 경우
if(X < leftPq.peek() && Y < leftPq.peek()) {
// X, Y를 leftPq에 넣어준다.
leftPq.add(X);
leftPq.add(Y);
// 중간 값인 leftPq의 루트를 rightPq로 옮겨준다.
rightPq.add(leftPq.poll());
}
// X, Y 둘 다 중간값보다 큰 경우
else if(X > leftPq.peek() && Y > leftPq.peek()) {
// X, Y를 rigthPq에 넣어준다.
rightPq.add(X);
rightPq.add(Y);
// rightPq의 루트를 leftPq로 옮겨준다.
leftPq.add(rightPq.poll());
}
else {
if(X < Y) {
leftPq.add(X);
rightPq.add(Y);
}
else {
leftPq.add(Y);
rightPq.add(X);
}
}
// 중간값 구하기
result = (result + leftPq.peek()) % MOD;
}
sb.append("#" + tc + " " + result + "\n");
}
System.out.println(sb);
}
}
728x90
'Problem Solving > SWEA' 카테고리의 다른 글
[SW Expert Academy, SWEA 7701] 염라대왕의 이름 정렬 (java) (0) | 2023.05.06 |
---|---|
[SW Expert Academy, SWEA 2948] 문자열 교집합 (java) (0) | 2023.05.04 |
[SW Expert Academy, SWEA 2930] 힙 (java) (1) | 2023.05.03 |
[SW Expert Academy, SWEA 3282] 0/1 Knapsack (java) (0) | 2023.05.03 |
[SW Expert Academy, SWEA 1767] [SW Test 샘플문제] 프로세서 연결하기 (java) (0) | 2023.04.11 |