import java.util.*;
class Solution {
public String[] solution(String[][] plans) {
String[] answer = new String[plans.length];
Stack<String[]> working=new Stack<>();
Queue<String[]> wait=new LinkedList<>();
int index=0;
Arrays.sort(plans,(a,b)->{
if(a[1].split(":")[0].equals(b[1].split(":")[0]))
return Integer.parseInt(a[1].split(":")[1])-Integer.parseInt(b[1].split(":")[1]);
else
return Integer.parseInt(a[1].split(":")[0])-Integer.parseInt(b[1].split(":")[0]);
});
for(String[] s:plans)
wait.add(s);
while(!wait.isEmpty()){
working.push(wait.poll());
if(wait.isEmpty()){
while(!working.isEmpty()){
answer[index]=working.pop()[0];
index++;
}
break;
}
int term=calcTerm(wait.peek()[1],working.peek()[1]);
while(!working.isEmpty()){
if(term>=Integer.parseInt(working.peek()[2])){
answer[index]=working.peek()[0];
term-=Integer.parseInt(working.pop()[2]);
index++;
}
else{
String[] work= working.pop();
work[2]=String.valueOf((Integer.parseInt(work[2])-term));
working.push(work);
break;
}
}
}
return answer;
}
public int calcTerm(String wait, String working){
int waitMin=Integer.parseInt(wait.split(":")[0])*60+Integer.parseInt(wait.split(":")[1]);
int workMin=Integer.parseInt(working.split(":")[0])*60+Integer.parseInt(working.split(":")[1]);
return waitMin-workMin;
}
}
문제에서 요구한 대로 의식의 흐름대로 풀면 된다.
나는 대기중인 과제를 큐에, 시작한 과제는 스택을 활용해서 다루었다.
(1) 과제 리스트를 시작 시각 순서대로 정렬한 후, 큐(대기중인 과제)에 넣어준다.
(2) 대기중인 과제가 없을 때까지 반복문을 실행한다.
문제에서 요구하는대로 구현해준다면 크게 어렵지 않은 문제였다.
스택,큐를 활용하는 문제유형인지는 잘 모르겠는데 뭔가 익숙한 느낌이 드는 문제였다.
출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges