유블로그

[Java] swea 2477 차량정비소 본문

알고리즘

[Java] swea 2477 차량정비소

yujeong kang 2021. 4. 21. 02:06

[Java] swea 2477 차량정비소

 

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV6c6bgaIuoDFAXy&categoryId=AV6c6bgaIuoDFAXy&categoryType=CODE&problemTitle=sw&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=2

 

SW Expert Academy

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

swexpertacademy.com

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class 모의SW_2477_차량정비소  {
	static class Customer {
		int receptionNum, repairNum;
		public Customer() {}
		public Customer(int receptionNum, int repairNum) {
			this.receptionNum = receptionNum;
			this.repairNum = repairNum;
		}
	}
	static class Box {
		int customerNum, remainTime;
		
		public Box() {
			this.customerNum = -1;
		}
		public Box(int customerNum, int remainTime) {
			this.customerNum = customerNum;
			this.remainTime = remainTime;
		}
	}
	static Customer[] customerInfo;
	static int N, M, K, A, B;
	static int[] receptionTimes, repairTimes;
	static int[][] cusArrTimes;
	static Box[] receptions, repairs;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		for (int testcase = 1; testcase <= T; testcase++) {
			StringTokenizer 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());
			
			receptionTimes = new int[N];
			repairTimes = new int[M];
			cusArrTimes = new int[K][2];
			customerInfo = new Customer[K+1];
			for (int i = 1; i <= K; i++) {
				customerInfo[i] = new Customer();
			}
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < N; i++) {
				receptionTimes[i] = Integer.parseInt(st.nextToken());
			}
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < M; i++) {
				repairTimes[i] = Integer.parseInt(st.nextToken());
			}
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < K; i++) {
				cusArrTimes[i][0] = i+1;
				cusArrTimes[i][1] = Integer.parseInt(st.nextToken());
			}
			Arrays.sort(cusArrTimes, new Comparator<int[]>() {
				@Override
				public int compare(int[] o1, int[] o2) {
					return o1[1]-o2[1];
				}
			});
			receptions = new Box[N];
			for (int i = 0; i < N; i++) {
				receptions[i] = new Box();
			}
			repairs = new Box[M];
			for (int i = 0; i < M; i++) {
				repairs[i] = new Box();
			}
			
			solve();
			
			int sum = 0;
			for (int i = 1; i <= K; i++) {
				if(customerInfo[i].receptionNum == A && customerInfo[i].repairNum == B) 
					sum += i;
			}
			
			System.out.println("#" + testcase + " " + (sum == 0 ? -1 : sum));
		} // tc
		
		
	}

	private static void solve() {
		int t = 0, cusIdx = 0, cnt = 0;
		Queue<Integer> cusArrWaitQ = new LinkedList<>(), repairWaitQ = new LinkedList<>();
		while(true) {
			if(cnt == K && cusArrWaitQ.size() == 0 && repairWaitQ.size() == 0) {
				boolean isEnd = true;
				for (int i = 0; i < N; i++) {
					if(receptions[i].customerNum > -1) {
						isEnd = false;
						break;
					}
				}
				if(isEnd) {
					for (int i = 0; i < M; i++) {
						if(repairs[i].customerNum > -1) {
							isEnd = false;
							break;
						}
					}
				}
				if(isEnd) break;
			}
			
			for (int i = cusIdx; i < K; i++) {
				if(cusArrTimes[i][1] == t) {
					cusArrWaitQ.add(i+1);
					cnt++;
				}
				else if(cusArrTimes[i][1] > t) {
					cusIdx = i;
					break;
				}
			} // i
			
			for (int i = 0; i < N; i++) {
				if(receptions[i].customerNum > -1) {
					receptions[i].remainTime--;
					if(receptions[i].remainTime == 0) {
						customerInfo[receptions[i].customerNum].receptionNum = i+1;
						repairWaitQ.add(receptions[i].customerNum);
						receptions[i].customerNum = -1;
					}
				}
				if(receptions[i].customerNum == -1 && cusArrWaitQ.size() > 0) {
					receptions[i].customerNum = cusArrWaitQ.poll();
					receptions[i].remainTime = receptionTimes[i];
				}
			}

			for (int i = 0; i < M; i++) {
				if(repairs[i].customerNum > -1) {
					repairs[i].remainTime--;
					if(repairs[i].remainTime == 0) {
						customerInfo[repairs[i].customerNum].repairNum = i+1;
						repairs[i].customerNum = -1;
					}
				}
				if(repairs[i].customerNum == -1 && repairWaitQ.size() > 0) {
					repairs[i].customerNum = repairWaitQ.poll();
					repairs[i].remainTime = repairTimes[i];
				}
			}
			
			t++;
			
		} //while

	} //solve
	
}

 

solve() 함수 자체는 짧은 듯!

고객이 도착하여 접수칸에 가기 전까지 큐1,

접수 끝나고 수리 가기 전 큐2

이렇게 2개가 필요하다.

 

그리고 reception 배열과 repair 배열로 각 칸에 고객이 있는 상태인지, 있다면 몇 초 남았는지 기록한다.

문제 설명 그대로 따라가면 되는데,

고객을 순회하면서 고객이 도착했다면 큐1에 넣어놓는다.

 

reception 배열을 순회하면서 시간이 끝난애들은 큐2로 보내고

아니면 그냥 시간만 줄인다.

여기서 reception 비어있는 곳이 생기면 큐1에서 꺼내서 넣는다.

 

그다음 repair 배열을 순회하면서 시간이 끝난애들은 고객정보에 몇 번 수리 칸 있었는지 기록하고 없애고,

시간이 남은 애들은 시간만 줄인다.

'알고리즘' 카테고리의 다른 글

[Java] swea 1953 탈주범검거  (0) 2021.04.21
[Java] swea 2383 점심식사시간  (0) 2021.04.21
[Java] swea 2115 벌꿀채취  (0) 2021.04.19
[Java] swea 2117 홈방범서비스  (0) 2021.04.19
[Java] swea 2112 보호필름  (0) 2021.04.19