https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV6c6bgaIuoDFAXy
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution {
public static int T, N, M, K, A, B, ans, time;
public static int[] a[], b[], k[], visitedA;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
// 1. 입력받기
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
// 1-1. 입력받을 배열 초기화
ans = 0;
a = new int[N + 1][2];
b = new int[M + 1][2];
k = new int[K + 1][5];
Queue<int[]> qa = new LinkedList<>();
List<int[]> qb = new ArrayList<>();
// 1-2. 접수 창구 처리 시간
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
a[i][0] = Integer.parseInt(st.nextToken());
}
// 1-3. 정비 창구 처리 시간
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= M; i++) {
b[i][0] = Integer.parseInt(st.nextToken());
}
// 1-4. 고객 도착 시간
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= K; i++) {
k[i][0] = Integer.parseInt(st.nextToken());
qa.offer(new int[] { i, k[i][0] });
}
// 2. 접수 창구
while (!qa.isEmpty()) {
int[] cur = qa.poll();
int knum = cur[0]; // 고객 번호
int ktime = cur[1]; // 도착한 시간
boolean flag = false; // 접수 창구에 바로 넣었는지 확인하는 변수
// b. 여러개 비어있음 -> 접수 창구 번호가 작은곳으로 감
for (int i = 1; i <= N; i++) {
if (a[i][1] <= ktime) {
flag = true;
a[i][1] = a[i][0] + ktime; // 도착시간 + 창구 처리 시간
k[knum][1] = i; // 고객번호가 이용한 창구 번호
k[knum][3] = a[i][1]; // 고객번호가 정비 창구로 간 시간
qb.add(new int[] { knum, k[knum][3], i });
break;
}
}
if (!flag) {// 2-3. 비어있는 접수 창구가 없음
int min = Integer.MAX_VALUE; // 최소로 걸리는 창구 시간
int minidx = 0; // 그 창구 번호
for (int i = 1; i <= N; i++) {
if (a[i][1] < min) {
min = a[i][1];
minidx = i;
}
}
a[minidx][1] = a[minidx][0] + min;
k[knum][1] = minidx;
k[knum][3] = a[minidx][1];
qb.add(new int[] { knum, k[knum][3], minidx });
}
}
// a. 일찍 도착하고 같이 도착했다면 이용했던 접수 창구 번호가 작은 고객이 우선
qb.sort((o1, o2) -> {
int result = o1[1] - o2[1];
if (result == 0) {
result = o1[2] - o2[2];
return result;
}
return result;
});
// 3. 정비 창구
for (int p = 0; p < qb.size(); p++) {
int[] cur = qb.get(p);
int knum = cur[0]; // 고객 번호
int ktime = cur[1]; // 도착한 시간
boolean flag = false; // 정비 창구에 바로 넣었는지 확인하는 변수
// b. 여러개 비어있음 -> 정비 창구 번호가 작은곳으로 감
for (int i = 1; i <= M; i++) {
if (b[i][1] <= ktime) {
flag = true;
b[i][1] = b[i][0] + ktime; // 도착시간 + 정비 처리 시간
k[knum][2] = i; // 고객번호가 이용한 창구 번호
k[knum][4] = b[i][1];
break;
}
}
if (!flag) {// 3-3. 비어있는 정비 창구가 없음
int min = Integer.MAX_VALUE; // 최소로 걸리는 창구 시간
int minidx = 0; // 그 창구 번호
for (int i = 1; i <= M; i++) {
if (b[i][1] < min) {
min = b[i][1];
minidx = i;
}
}
b[minidx][1] = b[minidx][0] + min;
k[knum][2] = minidx;
k[knum][4] = b[minidx][1];
}
}
// for (int i = 1; i <= K; i++) {
// for(int j = 0;j<5;j++) {
// System.out.print(k[i][j]+ " ");
// }
// System.out.println();
// }
// System.out.println();
// 4. 고객이 이용한 접수창구가 A이고 정비 창구가 B이면 ans += 고객번호
for (int i = 1; i <= K; i++) {
if (k[i][1] == A && k[i][2] == B) {
// System.out.println(i + " ");
ans += i;
}
}
// 4-1. ans 출력
if (ans == 0) {
System.out.println("#" + tc + " " + "-1");
} else {
System.out.println("#" + tc + " " + ans);
}
}
}
}
'코딩테스트 > JAVA' 카테고리의 다른 글
[백준 JAVA] 1920번: 수 찾기 (0) | 2024.09.09 |
---|---|
[SWEA JAVA] 5643. [Professional] 키 순서 (4) | 2024.09.06 |
[백준 JAVA] 1917번: 정육면체 전개도 (0) | 2024.09.05 |
[SWEA JAVA] 5215. 햄버거 다이어트 (2) | 2024.09.04 |
[백준 JAVA] 16236번: 아기 상어 (0) | 2024.09.04 |