Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- java Collections.sort()
- char to str
- 알고리즘 그래프
- 알고리즘
- jquery 속성선택자
- jquery dom 계층 선택자
- 서로소
- 후위표기
- 재귀
- str to char array
- 조합 재귀
- 자바 순열 코드
- 자바
- 순열 재귀
- 재귀함수
- 자바입출력
- jquery 필터선택자
- Java
- 자바 조합 재귀
- 상속
- 자바스크립트 이벤트처리
- 순열코드
- java 내부 클래스
- 자바스크립트 이벤트중지
- Interface
- jquery 이벤트 처리
- java lambda
- parseInt()
- 자바 재귀 조합
- inner class
Archives
- Today
- Total
유블로그
[Java] swea 2477 차량정비소 본문
[Java] swea 2477 차량정비소
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 |