[모의 SW 역량테스트] 차량 정비소

차량 정비소

N 개의 접수창구, M 개의 정비창구가 있다.

각 창구는 1부터 번호가 붙어있다.

각 창구마다 소요시간이 주어진다.

차량 정비소를 방문한 총 고객은 K명이다.

각 고객이 차량정비소에 도착하는 시간이 고객 번호 순서대로 주어진다.

고객은 정비소에 도착한 후 접수를 한다.

빈창구가 없다면 생길 때 까지 기다린다.

접수 창구의 우선 순위는 다음과 같다.

  1. 여러 고객이 기다리는 경우 고객번호가 낮은 순서부터 우선 접수한다.
  2. 빈 창구가 여러 곳일 경우 창구 번호가 적은 곳부터 간다.

정비 창구의 우선 순위는 다음과 같다.

  1. 먼저 기다리는 고객이 우선한다.
  2. 여러 고객이 동시에 접수창구에서 접수하고 오는 경우 접수창구의 번호가 낮은 순서대로 우선한다.
  3. 빈 창구가 여러 곳일 경우 창구 번호가 적은 곳부터 간다.

접수창구와 정비창구의 번호가 주어졌을 때 두 창구 모두 동시에 이용하는 고객들의 번호의 합을 구하여라.

없을 경우 0을 출력한다.


풀이

  1. 입력

    주어지는 창구와 고객들의 정보를 각각 배열로 받는다.

    각 번호는 1번부터 시작하기 때문에 배열의 크기를 1 늘려준다.

  2. 처리

    고객들의 정보를 저장할 객체를 만든다. - Customer

    Customer에는 a/b에서 걸린시간, 고객번호, a창구 번호, b창구 번호를 저장한다.

    queue를 사용하여 순서대로 조건에 맞게 처리할 수 있도록 하였다.

    while을 통해 시간이 경과하는 것을 처리해준다.

    1. 고객의 도착 시간

      • -1을 해주면서 0이 되면 waitA 큐에 넣어준다.

      • 큐에 들어간 것이 K와 같다면 이 과정은 생략하도록 처리한다.

    2. 정비 창구

      • 접수창구에서 바로 넘어올 수 있도록 정비 창구먼저 처리한다.

      • waitB 큐가 있고, 창구가 비어있으면 창구에 고객 객체를 넣는다.
        • 이때, 객체의 b값에 창구의 번호를 넣어준다.
      • 비어있지 않은 창구의 고객 객체의 b_time을 늘린다.

      • b_time이 주어진 시간과 같다면 end 리스트에 넣는다.
    3. 접수 창구

      • 정비창구와 똑같이 구현한다.
    4. while 종료

      • end리스트에 넣을 때 카운팅을 해주고 K와 같아지면 break
    5. end리스트에서 a와 b둘다 방문한 고객 번호를 누적한다.

import java.io.BufferedReader;
import java.io.IOException;
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 차량정비소 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		
		for(int tc = 1; tc <= T; tc++) {
			StringTokenizer st1 = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st1.nextToken());
			int M = Integer.parseInt(st1.nextToken());
			int K = Integer.parseInt(st1.nextToken());
			int A = Integer.parseInt(st1.nextToken());
			int B = Integer.parseInt(st1.nextToken());
			
			int[] shopA = new int[N+1];
			int[] shopB = new int[M+1];
			int[] customer = new int[K+1];
			
			StringTokenizer st2 = new StringTokenizer(br.readLine());
			for(int i = 1; i < N+1; i++) {
				shopA[i] = Integer.parseInt(st2.nextToken());
			}
			
			StringTokenizer st3 = new StringTokenizer(br.readLine());
			for(int i = 1; i < M+1; i++) {
				shopB[i] = Integer.parseInt(st3.nextToken());
			}
			
			StringTokenizer st4 = new StringTokenizer(br.readLine());
			for(int i = 1; i < K+1; i++) {
				customer[i] = Integer.parseInt(st4.nextToken());
			}
			
			
			Queue<Customer> waitA = new LinkedList<>();
			Queue<Customer> waitB = new LinkedList<>();
			Customer[] chkA = new Customer[N+1];
			Customer[] chkB = new Customer[M+1];
			List<Customer> end = new ArrayList<>();
			
			int cnt = 0;
			int arrived = 0;
			
			while(true) {
				if(cnt == K) {
					break;
				}
				
				if(arrived < K) {
					for(int i = 1; i < K+1; i++) {
						if(customer[i] == 0) {
							waitA.add(new Customer(0, 0, i, 0, 0));
							arrived++;
						}
						customer[i]--;
					}
				}
				
				
				for(int i = 1; i < M+1; i++) {
					if(chkB[i] == null && !waitB.isEmpty()) {
						chkB[i] = waitB.poll();
						chkB[i].b = i;
					}
					if(chkB[i] != null) {
						chkB[i].b_time++;
						if(chkB[i].b_time == shopB[i]) {
							end.add(chkB[i]);
							chkB[i] = null;
							cnt++;
						}
					}
				}
				
				for(int i = 1; i < N+1; i++) {
					if(chkA[i] == null && !waitA.isEmpty()) {
						chkA[i] = waitA.poll();
						chkA[i].a = i;
					}
					if(chkA[i] != null) {
						chkA[i].a_time++;
						if(chkA[i].a_time == shopA[i]) {
							waitB.add(chkA[i]);
							chkA[i] = null;
						}
					}
				}
				
				
			}
			
			int ans = 0;
			for(int i = 0; i < end.size(); i++) {
				if(end.get(i).a == A && end.get(i).b == B) {
					ans += end.get(i).c_num;
				}
			}
			if(ans == 0) {
				ans = -1;
			}
			System.out.println("#"+tc+" "+ans);
			
		}
		
	}
	static class Customer{
		int a_time;
		int b_time;
		int c_num;
		int a;
		int b;
		
		public Customer(int a_time, int b_time, int c_num, int a, int b) {
			this.a_time = a_time;
			this.b_time = b_time;
			this.c_num = c_num;
			this.a = a;
			this.b = b;
		}
	}
}