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
- Interface
- 자바 순열 코드
- inner class
- 자바스크립트 이벤트처리
- java 내부 클래스
- 후위표기
- 자바입출력
- 알고리즘 그래프
- 자바
- jquery 이벤트 처리
- 재귀
- 순열 재귀
- 자바 조합 재귀
- java Collections.sort()
- jquery dom 계층 선택자
- java lambda
- 알고리즘
- 서로소
- jquery 필터선택자
- 자바스크립트 이벤트중지
- 재귀함수
- 자바 재귀 조합
- 조합 재귀
- parseInt()
- str to char array
- jquery 속성선택자
- char to str
- 순열코드
- Java
- 상속
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 |