[모의 SW 역량테스트] 차량 정비소
N 개의 접수창구, M 개의 정비창구가 있다.
각 창구는 1부터 번호가 붙어있다.
각 창구마다 소요시간이 주어진다.
차량 정비소를 방문한 총 고객은 K명이다.
각 고객이 차량정비소에 도착하는 시간이 고객 번호 순서대로 주어진다.
고객은 정비소에 도착한 후 접수를 한다.
빈창구가 없다면 생길 때 까지 기다린다.
접수 창구의 우선 순위는 다음과 같다.
- 여러 고객이 기다리는 경우 고객번호가 낮은 순서부터 우선 접수한다.
- 빈 창구가 여러 곳일 경우 창구 번호가 적은 곳부터 간다.
정비 창구의 우선 순위는 다음과 같다.
- 먼저 기다리는 고객이 우선한다.
- 여러 고객이 동시에 접수창구에서 접수하고 오는 경우 접수창구의 번호가 낮은 순서대로 우선한다.
- 빈 창구가 여러 곳일 경우 창구 번호가 적은 곳부터 간다.
접수창구와 정비창구의 번호가 주어졌을 때 두 창구 모두 동시에 이용하는 고객들의 번호의 합을 구하여라.
없을 경우 0을 출력한다.
풀이
-
입력
주어지는 창구와 고객들의 정보를 각각 배열로 받는다.
각 번호는 1번부터 시작하기 때문에 배열의 크기를 1 늘려준다.
-
처리
고객들의 정보를 저장할 객체를 만든다. - Customer
Customer에는 a/b에서 걸린시간, 고객번호, a창구 번호, b창구 번호를 저장한다.
queue를 사용하여 순서대로 조건에 맞게 처리할 수 있도록 하였다.
while을 통해 시간이 경과하는 것을 처리해준다.
-
고객의 도착 시간
-
-1을 해주면서 0이 되면 waitA 큐에 넣어준다.
-
큐에 들어간 것이 K와 같다면 이 과정은 생략하도록 처리한다.
-
-
정비 창구
-
접수창구에서 바로 넘어올 수 있도록 정비 창구먼저 처리한다.
- waitB 큐가 있고, 창구가 비어있으면 창구에 고객 객체를 넣는다.
- 이때, 객체의 b값에 창구의 번호를 넣어준다.
-
비어있지 않은 창구의 고객 객체의 b_time을 늘린다.
- b_time이 주어진 시간과 같다면 end 리스트에 넣는다.
-
-
접수 창구
- 정비창구와 똑같이 구현한다.
-
while 종료
- end리스트에 넣을 때 카운팅을 해주고 K와 같아지면 break
-
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;
}
}
}