삐까냥의 파도타기
2477. [모의 SW 역량테스트] 차량 정비소 본문
실제 업무를 수행하듯이 코드를 그대로 구현했습니다.
다만 시간을 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; } } |
'코딩 > SW Expert Academy' 카테고리의 다른 글
1860. 진기의 최고급 붕어빵 (0) | 2017.11.15 |
---|---|
1244. [S/W 문제해결 응용] 2일차 - 최대 상금 (0) | 2017.11.15 |
1491. 원재의 벽 꾸미기 (0) | 2017.11.14 |
1206. [S/W 문제해결 기본] 1일차 - View (0) | 2017.11.13 |
1545번) 거꾸로 출력해 보아요 (0) | 2017.11.12 |