import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class People {
int no;
int cept = -1;
int pair = -1;
public People(int no) {
this.no = no;
}
public void tag(int i) {
if (cept == -1) {
cept = i;
} else if (pair == -1) {
pair = i;
}
}
}
class Factory {
int seatSize;
int[] state;
People[] seat;
ArrayList<Integer> wList;
Queue<People> inQueue;
Queue<People> outQueue;
public Factory(ArrayList<Integer> wList, Queue inQueue, Queue outQueue) {
this.seatSize = wList.size();
this.wList = wList;
this.inQueue = inQueue;
this.outQueue = outQueue;
state = new int[seatSize];
seat = new People[seatSize];
for(int i=0 ; i<seatSize; i++) {
state[i] = wList.get(i);
}
}
public void tick() {
for (int i = 0; i < seatSize; i++) {
if (seat[i]!=null && state[i] != 0) {
state[i]--;
}
}
}
public void comeOut() {
for (int i = 0; i < seatSize; i++) {
if (seat[i]!=null && state[i] == 0) {
outQueue.offer(seat[i]);
state[i] = wList.get(i);
seat[i] = null;
}
}
}
public void comeIn() {
for (int i = 0; i < seatSize; i++) {
if (state[i] == wList.get(i)) {
if (!inQueue.isEmpty()) {
seat[i] = inQueue.poll();
seat[i].tag(i+1);
// Solution.log(seat[i]!=null ?"O":"X");
}
}
}
}
}
class Solution {
static boolean Debug = true;
private static int T;
public static void main(String args[]) throws Exception {
BufferedReader br;
if (Debug) {
// C:\Users\wvimi\Downloads\input (2).txt
File f = new File("C:\\Users\\wvimi\\Downloads", "sample_input (8).txt");
FileReader reader = new FileReader(f);
br = new BufferedReader(reader);
} else {
br = new BufferedReader(new InputStreamReader(System.in)); // 직접입력시 이용
}
StringTokenizer st;
int TestSize = Integer.parseInt(br.readLine());
for (T = 1; T <= TestSize; T++) {
st = new StringTokenizer(br.readLine());
int ReceptSize = Integer.parseInt(st.nextToken());
int RepairSize = Integer.parseInt(st.nextToken());
int CustomerNum = Integer.parseInt(st.nextToken());
int ReceptUseNo = Integer.parseInt(st.nextToken());
int RepairUseNo = Integer.parseInt(st.nextToken());
// 좌석 마다 걸리는 시간
st = new StringTokenizer(br.readLine());
ArrayList<Integer> cepList = new ArrayList();
for (int i = 0; i < ReceptSize; i++) {
cepList.add(Integer.parseInt(st.nextToken()));
}
// 좌석 마다 걸리는 시간
ArrayList<Integer> piarList = new ArrayList();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < RepairSize; i++) {
piarList.add(Integer.parseInt(st.nextToken()));
}
// 고객 오는 스케줄
st = new StringTokenizer(br.readLine());
ArrayList<Integer> duleList = new ArrayList();
for (int i = 0; i < CustomerNum; i++) {
duleList.add(Integer.parseInt(st.nextToken()));
}
// 로비1(대기), 로비2(대기), 로비3(완료)
Queue<People> Robby1 = new LinkedList();
Queue<People> Robby2 = new LinkedList();
Queue<People> Robby3 = new LinkedList();
Factory cepFactory = new Factory(cepList, Robby1, Robby2);
Factory pairFactory = new Factory(piarList, Robby2, Robby3);
boolean isduleEnd = false;
int timer = -1;
while (true) {
timer++;
// Robby1에 손님 입장
if (!isduleEnd) {
for (int i = 0; i < CustomerNum; i++) {
// 시간이 되면 입장한다.
if (duleList.get(i) == timer) {
Robby1.offer(new People(i+1));
// 마지막 고객까지 나갔다면
if (i == CustomerNum) {
isduleEnd = true;
}
}
}
}
// 시간이 흐른다. (작업량 1감소)
cepFactory.tick();
pairFactory.tick();
// 완료된 사람은 다음 장소로 이동.
cepFactory.comeOut();
pairFactory.comeOut();
// 대기 중인 사람은 들어온다.
cepFactory.comeIn();
pairFactory.comeIn();
if (Robby3.size() == CustomerNum) {
// 모든 고객이 일을 마친다면...
break;
}
}
int Answer = 0;
People person;
while(!Robby3.isEmpty()) {
person = Robby3.poll();
// 지갑을 놓고온 접수, 수리 테이블을 이용한 고객을 추적
if(person.cept == ReceptUseNo && person.pair == RepairUseNo) {
Answer += person.no;
}else {
// Non-target
}
}
System.out.println(String.format("#%d %d", T, Answer > 0 ? Answer : -1));
}
}
public static void log(String input) {
if (Debug) {
System.out.println(input);
}
}
public static void log(String input, Object... args) {
if (Debug) {
System.out.println(String.format(input, args));
}
}
}
'Knowledge > 알고리즘' 카테고리의 다른 글
2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2017.10.15 |
---|---|
2383. [모의 SW 역량테스트] 점심 식사시간 (0) | 2017.10.15 |
1259. [S/W 문제해결 응용] 7일차 - 금속막대 (0) | 2017.10.08 |
2117. [모의 SW 역량테스트] 홈 방범 서비스 (0) | 2017.10.07 |
2382. [모의 SW 역량테스트] 미생물 격리 (0) | 2017.10.07 |