삐까냥의 파도타기

2477. [모의 SW 역량테스트] 차량 정비소 본문

코딩/SW Expert Academy

2477. [모의 SW 역량테스트] 차량 정비소

금손형아 2017. 11. 13. 14:33

문제 출처 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV6c6bgaIuoDFAXy&categoryId=AV6c6bgaIuoDFAXy&categoryType=CODE



실제 업무를 수행하듯이 코드를 그대로 구현했습니다.

다만 시간을 1씩 증가하여 구현한것은 효율적이지 못해서

다음 수행해야할 시간을 계산하여 다음 시간으로 건너띄게 구현했습니다.


정답률이 약 50%정도인걸 보면 난이도는 쉬운편이네요.

실제로 알고리즘 함정은 없었으며,

문제대로 구현 가능한가를 판가름하기 위한 문제입니다.



import java.util.LinkedList;

import java.util.Scanner;


public class Solution {


static LinkedList<people> groupAPeople = new LinkedList<people>(); //A창구로 가기 위한 사람들

static LinkedList<people> groupBPeople = new LinkedList<people>(); //B창구로 가기 위한 사람들

static window[] windowA, windowB; //A창구, B창구 목록

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

for ( int i = 1; i <= num; i++ ) {

int N = sc.nextInt();

int M = sc.nextInt();

int K = sc.nextInt();

int A = sc.nextInt();

int B = sc.nextInt();

windowA = new window[N];

windowB = new window[M];

for (int j = 0; j < N; j++ ) {

windowA[j] = new window(j+1, sc.nextInt(), "A"); //A창구 설정

}

for (int j = 0; j < M; j++ ) {

windowB[j] = new window(j+1, sc.nextInt(), "B"); //B창구 설정

}

for (int j = 1; j <= K; j++ ) {

groupAPeople.add(new people(j, sc.nextInt())); //A창구에 가기 위한 사람들

}

System.out.println("#" + i + " " + calPeople(A, B));

}

}

public static int calPeople(int A, int B) {

int nowTime = 0, endPeopleNum = 0, maxPeopleNum = groupAPeople.size(), result = 0;

while( endPeopleNum < maxPeopleNum ) { //모든 사람이 끝날때 까지 수행

int nextTime = -1;

//A창구

for ( int i = 0; i < windowA.length; i++ ) {

if ( windowA[i].isUsed() ) { //A창구의 i번째가 사용중이면

int finishTime = windowA[i].getFinishTime(); //끝날 시간을 받아오고

if ( finishTime != nowTime ) { //안끝났으면

nextTime = getNextTime(nextTime, finishTime); //끝날 시간을 계산하고 다음 창구로 감

continue;

}

groupBPeople.add(windowA[i].getFinishPeople()); //끝났으면 끝난 사람을 B창구로 보내줌

}

                

if ( groupAPeople.size() > 0 ) { //A창구 대기 사람이 있으면

people nextPeople = groupAPeople.getFirst();

int calTime = nextPeople.getArriveTime(); //다음 사람이 도착할 시간

if ( calTime <= nowTime ) { //다음 사람이 도착했으면

windowA[i].setNowPeople(nowTime, nextPeople); //A창구에 접수

groupAPeople.removeFirst();

calTime = windowA[i].getFinishTime(); //A창구가 끝날 시간

}

nextTime = getNextTime(nextTime, calTime); //다음 시간 계산

}

}

//B창구

for ( int i = 0; i < windowB.length; i++ ) {

//B창구가 사용중이면 끝났는지 확인하기

if ( windowB[i].isUsed() ) { //B창구의 i번째가 사용중이면

int finishTime = windowB[i].getFinishTime(); //끝날 시간을 받아오고

if ( finishTime != nowTime ) { //안끝났으면

nextTime = getNextTime(nextTime, finishTime); //끝날 시간을 계산하고 다음 창구로 감

continue;

}

endPeopleNum += 1; //끝났으면 끝난 사람 하나 추가

people endPeople = windowB[i].getFinishPeople(); //끝난 사람의 A창구와 B창구 가져오기

if ( endPeople.getA() == A && endPeople.getB() == B ) {

result += endPeople.getNum();

}

//B창구 대기 사람이 있으면 접수하기

if ( groupBPeople.size() > 0 ) { //B창구 대기 사람이 있으면

windowB[i].setNowPeople(nowTime, groupBPeople.getFirst()); //B창구에 접수

groupBPeople.removeFirst();

nextTime = getNextTime(nextTime, windowB[i].getFinishTime()); //다음 시간 계산

}

}

nowTime = nextTime; //다음 시간으로 이동

}

if ( result == 0 ) {

return -1;

}

return result;

}

public static int getNextTime(int nextTime, int time) {

if ( nextTime == -1 || nextTime >= time ) {

return time;

}

return nextTime;

}

}


class window {

int num, delayTime = 0, finishTime = -1;

String type;

people nowPeople = null;

public window(int N, int delayTime, String type) {

num = N;

this.delayTime = delayTime;

this.type = type;

}

public void setNowPeople(int nowTime, people nowPeople) {

finishTime = nowTime + delayTime;

this.nowPeople = nowPeople;

if ( type.equals("A") ) {

this.nowPeople.setA(num);

} else {

this.nowPeople.setB(num);

}

}

public int getFinishTime() {

return finishTime;

}

public people getFinishPeople() {

people now = nowPeople;

this.nowPeople = null;

return now;

}

public boolean isUsed() {

if ( this.nowPeople == null ) {

return false;

}

return true;

}

}


class people {

int arriveTime;

int A, B;

int num;

public people(int num, int arriveTime) {

this.num = num;

this.arriveTime = arriveTime;

}

public void setA(int A) {

this.A = A;

}

public void setB(int B) {

this.B = B;

}

public int getA() {

return A;

}

public int getB() {

return B;

}

public int getArriveTime() {

return arriveTime;

}

public int getNum() {

return num;

}

}