728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/176962#
풀이
이 문제는 구현 문제이며 필자는 과제를 담고 있는 배열을 큐를 사용해 사용했고, 남아있는 과제에 스택을 적용해 사용했다. 큐를 사용해 진행중인 과제를 구현해 순서에 맞게 진행되는 과제의 흐름을 직관적으로 활용할 수 있으며, 남아있는 과제에 스택을 적용해 나중에 들어온 과제부터 수행한다는 제한 사항을 충족할 수 있다.
첫번째 풀이는 1시간 정도 걸렸는데, 6번과 9번 케이스에서 계속 틀려서 30분은 고민을 했다.
// stack을 이용해 멈춘 과제 저장 후 하나씩 빼내면서 잔업 진행
function solution(plans) {
const newPlans = plans.map(([sub, st, due]) => {
const [hour, min] = st.split(':');
const stTime = (+hour * 60) + +min;
return [sub, stTime, stTime + +due, +due];
}).sort((a, b) => a[1] - b[1]);
const wait = [];
const answer = [];
let doing = '';
let curTime = newPlans[0][1];
while(newPlans.length > 0){
const curTask = newPlans.shift();
const nextTask = newPlans[0] || ['END', Infinity, Infinity, Infinity];
if(curTask[2] > nextTask[1]){
curTask[3] -= (nextTask[1] - curTask[1]);
wait.push(curTask);
continue;
}
else if(curTask[2] === nextTask[1]) {
answer.push(curTask[0]);
continue;
}
else if(curTask[2] < nextTask[1]){
answer.push(curTask[0]);
if(wait.length > 0 && newPlans.length > 0){
let remainTime = (nextTask[1] - curTask[2])
while(wait.length > 0){
const waitTask = wait.pop();
if(remainTime > 0 && waitTask[3] - remainTime > 0) {
waitTask[3] -= remainTime;
wait.push(waitTask);
break;
}
else {
remainTime -= waitTask[3];
answer.push(waitTask[0]);
}
}
}
}
}
for(let i = wait.length - 1; i >= 0; i--){
answer.push(wait[i][0]);
}
return answer
}
위 코드에서 문제점은 현제 과제와 다음 과제 사이의 여유시간이 존재하면 나머지 작업을 이어서 해줘야 하는데, 이때 다음 과제 시작 시간보다 오래 걸릴 경우 나머지 작업의 잔여 시간에서 수행한 시간을 빼서 저장해야 한다. 이 로직이 잘못된 것이다......
코드가 깔끔해 보이지도 않고 로직도 뒤죽박죽이라 그냥 수정 사항을 적용해 코드를 아래와 같이 다시 작성했다.
코드
// stack을 이용해 멈춘 과제 저장 후 하나씩 빼내면서 잔업 진행
function solution(plans) {
const newPlans = plans.map(([sub, st, due]) => {
const [hour, min] = st.split(':');
const stTime = (+hour * 60) + +min;
return [sub, stTime, stTime + +due, +due];
}).sort((a, b) => a[1] - b[1]);
const wait = [];
const answer = [];
let doing = '';
let curTime = newPlans[0][1];
let cnt = 0
while (newPlans.length > 0) {
const curTask = newPlans.shift();
const nextTask = newPlans[0];
if (!nextTask) {
answer.push(curTask[0]);
break;
}
let timeDif = nextTask[1] - curTask[2];
if (timeDif >= 0) {
answer.push(curTask[0]);
while (wait.length > 0) {
const waitTask = wait.pop();
if (timeDif >= waitTask[3]) {
answer.push(waitTask[0]);
timeDif -= waitTask[3];
}
else {
waitTask[3] -= timeDif;
wait.push(waitTask);
break;
}
}
}
else if (timeDif < 0) {
curTask[3] = (curTask[2] - nextTask[1]);
wait.push(curTask)
}
}
for (let i = wait.length - 1; i >= 0; i--) {
answer.push(wait[i][0]);
}
return answer
}
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 불량 사용자 (0) | 2024.07.30 |
---|---|
[JS] 두 원 사이의 정수 쌍 (1) | 2024.07.26 |
[JS] 우박수열 정적분 (0) | 2024.07.24 |
[JS] 스티커 모으기(2) (1) | 2024.07.23 |
[JS] 프로그래머스_Level 2_N-Queen (2) | 2024.07.23 |