[SW Expert Academy, SWEA 3000] 중간값 구하기 (java)
Problem Solving/SWEA

[SW Expert Academy, SWEA 3000] 중간값 구하기 (java)

728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV-fO0s6ARoDFAXT&categoryId=AV-fO0s6ARoDFAXT&categoryType=CODE&problemTitle=3000&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


※ 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