본문 바로가기

코딩테스트/JAVA

[SWEA JAVA] 2477. [모의 SW 역량테스트] 차량 정비소

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);
			}
		}
	}
}