과제 진행하기
과제를 받은 루는 다음과 같은 순서대로 과제를 하려고 계획을 세웠습니다.
- 과제는 시작하기로 한 시각이 되면 시작합니다.
- 새로운 과제를 시작할 시각이 되었을 때, 기존에 진행 중이던 과제가 있다면 진행 중이던 과제를 멈추고 새로운 과제를 시작합니다.
- 진행중이던 과제를 끝냈을 때, 잠시 멈춘 과제가 있다면, 멈춰둔 과제를 이어서 진행합니다.
- 만약, 과제를 끝낸 시각에 새로 시작해야 되는 과제와 잠시 멈춰둔 과제가 모두 있다면, 새로 시작해야 하는 과제부터 진행합니다.
- 멈춰둔 과제가 여러 개일 경우, 가장 최근에 멈춘 과제부터 시작합니다.
과제 계획을 담은 이차원 문자열 배열 plans
가 매개변수로 주어질 때, 과제를 끝낸 순서대로 이름을 배열에 담아 return 하는 solution 함수를 완성해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/176962
import java.util.*;
public class Main {
public static void main(String[] args) {
String[][] plans = {{"korean", "11:40", "30"}, {"english", "12:10", "20"}, {"math", "12:30", "40"}};
var reuslt = solution(plans);
System.out.println(Arrays.toString(reuslt));
}
public static String[] solution(String[][] plans) {
List<String> result = new ArrayList<>(plans.length);
LinkedList<Plan> planList = new LinkedList<>();
LinkedList<Plan> pandding = new LinkedList<>();
for (String[] plan : plans) {
planList.add(new Plan(plan[0], plan[1], plan[2]));
}
planList.sort(Comparator.comparingInt(o -> o.startTime));
var currentPlan = planList.poll();
var nextPlan = planList.peek();
int systemTime = currentPlan.startTime;
while (currentPlan != null) {
systemTime = currentPlan.startTime;
int currentPlanStart = currentPlan.startTime;
if (nextPlan == null) {
result.add(currentPlan.name);
while (!pandding.isEmpty()) {
result.add(pandding.poll().name);
}
break;
}
int nextPlanStart = nextPlan.startTime;
// 끝내지 못할때
if (currentPlanStart + currentPlan.playTime > nextPlanStart) {
// 남은시간 계산
currentPlan.playTime -= nextPlanStart - currentPlanStart;
pandding.push(currentPlan);
currentPlan = planList.poll();
nextPlan = planList.peek();
} else if (currentPlanStart + currentPlan.playTime == nextPlanStart) {
result.add(currentPlan.name);
currentPlan = planList.poll();
nextPlan = planList.peek();
} else { // 그전에 끝날 때
systemTime = currentPlan.startTime+currentPlan.playTime;
if (pandding.isEmpty()) { // 팬딩 없으면
result.add(currentPlan.name);
currentPlan = planList.poll();
nextPlan = planList.peek();
} else {
result.add(currentPlan.name);
currentPlan = pandding.poll();
currentPlan.startTime=systemTime;
if (planList.isEmpty()) {
while (!pandding.isEmpty()) {
result.add(pandding.poll().name);
}
break;
} else {
nextPlan = planList.peek();
}
}
}
}
return result.toArray(String[]::new);
}
}
class Plan {
String name;
int startTime;
int playTime;
public Plan(String name, String startTime, String playTime) {
this.name = name;
var startTemp = startTime.split(":");
this.startTime += Integer.parseInt(startTemp[0]) * 60;
this.startTime += Integer.parseInt(startTemp[1]);
this.playTime = Integer.parseInt(playTime);
}
}