프로그래머스 - 과제 진행하기
프로그래머스 - 과제 진행하기
Link
https://school.programmers.co.kr/learn/courses/30/lessons/176962
접근 방법
- 우선 문제 요구사항에 시간 순으로 정렬되어 있지 않을 수 있다고 나왔으니, 정렬을 고려해본다.
- 과제는 시작 시간과 수행에 필요한 시간이 할당돼있으며, 과제가 끝난 순서가 반환되어야 한다.
- 시작 시간을 기준으로 내림차순으로 정렬한다. (배열을 스택처럼 생각하면, 처음 할당되는 과제를 pop() 메소드로 뽑으면서 보고 싶으면 내림차순으로 정렬해야 한다는 것을 알 수 있음)
- 하나씩 뽑으면서 보는데, 일단 스택(대기열)에 등록된 과제를 기준으로 시작 시간이 해당 과제의 예상 종료 시간보다 이른 시점이면 예상 종료 시간을 지연시킨다.
- 그리고 뽑은 과제의 정보를 스택(대기열)에 등록시킨다.
- plans에 남은 과제가 없으면 stack을 다시 (예상 종료시간을 기준으로) 오름차순으로 정렬해서 이름만 뽑아준다.
Code
function solution(plans) {
plans.forEach((plan) => {
const [hour, min] = plan[1].split(":");
plan[1] = hour * 60 + min * 1;
plan[2] = plan[2] * 1;
});
plans.sort((a, b) => {
return b[1] - a[1];
});
const stack = [];
while (plans.length) {
const [name, start, playtime] = plans.pop();
stack.forEach((val, idx) => {
if (start < val[1]) {
stack[idx][1] += playtime;
}
});
stack.push([name, start + playtime]);
}
return stack.sort((a, b) => a[1] - b[1]).map((val) => val[0]);
}
해당 풀이를 참고하였습니다 : https://chamdom.blog/pg2-176962/