문제 설명

제한 사항

입출력 예


풀이
import java.util.stream.Collectors;
import java.util.ArrayList;
class Solution {
public String[] solution(String[][] plans) {
ArrayList<String> result = new ArrayList<>();
ArrayList<Plan> planList = new ArrayList<>();
ArrayList<Plan> stoppedPlanList = new ArrayList<>();
int plansRemainTime = 0;
for (String[] p : plans) planList.add(new Plan(p));
planList = planList.stream() // 시작 시간 순서대로 정렬
.sorted((p1, p2) -> p1.getTime() - p2.getTime())
.collect(Collectors.toCollection(ArrayList::new));
for (int i = 0; i < plans.length; i++) {
// 멈춘 과제가 있을 때
if (stoppedPlanList.size() > 0 && plansRemainTime > 0) {
for (int j = stoppedPlanList.size() - 1; j >= 0; j--) {
Plan stPlan = stoppedPlanList.get(j);
// 시간 안에 남은 한 과제를 할 수 있을 때
if (stPlan.getRemainTime() < plansRemainTime) {
plansRemainTime -= stPlan.getRemainTime();
result.add(stPlan.getName());
stoppedPlanList.remove(stPlan);
}
// 시간에 딱 맞춰서 남은 한 과제를 완료했을 때
else if (stPlan.getRemainTime() == plansRemainTime) {
result.add(stPlan.getName());
stoppedPlanList.remove(stPlan);
break;
}
else { // 시간이 부족해서 남은 한 과제를 다 못 했을 때
stPlan.setRemainTime(stPlan.getRemainTime() - plansRemainTime);
break;
}
}
}
if (i == plans.length - 1) break;
plansRemainTime = 0;
Plan currentPlan = planList.get(i);
Plan nextPlan = planList.get(i + 1);
// 다음 과제 시간 전에 마쳤을 때
if (currentPlan.getTime() + currentPlan.getRemainTime() < nextPlan.getTime()) {
result.add(currentPlan.getName());
plansRemainTime = nextPlan.getTime() - (currentPlan.getTime() + currentPlan.getRemainTime());
}
// 다음 과제 시간에 딱 맞췄을 때
else if (currentPlan.getTime() + currentPlan.getRemainTime() == nextPlan.getTime()) {
result.add(currentPlan.getName());
}
else { // 시간을 맞추지 못 해 해당 과제를 멈춘 과제로 이동
currentPlan.setRemainTime(currentPlan.getRemainTime()
- (nextPlan.getTime() - currentPlan.getTime()));
stoppedPlanList.add(currentPlan);
}
}
result.add(planList.get(planList.size() - 1).getName());
for (int j = stoppedPlanList.size() - 1; j >= 0; j--) result.add(stoppedPlanList.get(j).getName());
return result.toArray(String[]::new);
}
public class Plan {
private String name;
private int time;
private int remainTime;
public Plan(String[] plan) {
name = plan[0];
time = Integer.valueOf(plan[1].substring(0, 2)) * 60
+ Integer.valueOf(plan[1].substring(3, 5));
remainTime = Integer.valueOf(plan[2]);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public int getRemainTime() {
return remainTime;
}
public void setRemainTime(int remainTime) {
this.remainTime = remainTime;
}
}
}
후기
억울하다... 2시간 넘게 뭐가 틀렸는지 계속 찾아보고 로직이 틀렸나 계속 고민했는데 코드를 처음부터 천천히 살펴보니까 plansRemainTime를 0으로 만드는 코드가 한 줄 쓸데없이 끼어있어서 그걸 지우니까 통과했다...
상당히 고민할 점이 많은 문제여서 많이 고전했지만 요구하는 사항을 잘 이해하고 다 반영하니 충분히 풀 수 있었다. 그런데 대부분의 사람들이 멈춘 과제를 스택으로 풀었던데 나는 그냥 리스트를 이용해서 풀었다. 문제에서 대놓고 최신 문제부터 이어서 푼다고 해서 스택인 것을 직감했으나 이걸 문제 푸는 도중에 알아서 이미 작성한 코드를 바꾸기엔 너무 늦었었다. 그리고 나는 현재 시간을 이용하는 풀이가 아닌 다른 방법으로 풀었다. 따로 현재 시간 변수를 두지는 않고 과제 시작 시간 + 진행 시간과 다음 과제 시작 시간을 비교하고 그 차이를 변수에 저장하는 식(plansRemainTime과 Plan의 remainTime)으로 풀었다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][JAVA][Lv. 2] 카펫 (0) | 2023.08.07 |
|---|---|
| [프로그래머스][JAVA][Lv. 1] 최대공약수와 최소공배수 (0) | 2023.08.06 |
| [프로그래머스][Java][Lv. 2] 의상 (0) | 2023.08.03 |
| [프로그래머스][JAVA][Lv. 2] 올바른 괄호 (0) | 2023.08.03 |
| [프로그래머스][JAVA][Lv. 2] 문자열 압축 (0) | 2023.08.02 |