FrontEnd/프로그래머스

[JS] 과제 진행하기

728x90

차근차근 문제를 풀어보았다. 우선 문제 조건에서, plans 배열 안에 정렬되지 않은 상태로 주어질 수 있다고 나왔기에 정렬을 먼저 해주었다.

 

어차피 과제의 진행시간이 분단위로 나오기 때문에, 주어진 시간을 분단위로만 생각하기로 했다.

 

 

plans 배열을 입맛대로 바꿔준 후 문제를 해결한 과정은 아래와 같다.

 

 

1. 결국, 현재 진행할 과제와 다음에 진행할 과제를 비교해야 하기 때문에 로직 통일성을 위해서 시작이 제일 늦고, 기간도 엄청 많은 일정 하나를 의도적으로 추가해준다.

 

2. 완료할 과제를 담을 배열과 시작했지만 끝내지 못할 과제를 담을 스택으로 사용할 배열을 하나 생성한다.

 

3. 다음 과제와 비교해서 각각의 과정을 실행한다.

3-1. 이번 수행할 과제가 다음 과제 전에 충분히 실행할 수 있는 경우 => 결과에 현재 과제를 추가하고, 스택에 끝내지 못한 과제가 있다면 남은 시간과 비교해서 과제들을 수행

3-2. 이번 수행할 과제의 시간이 부족한 경우, 부족한 만큼의 시간만 가지게 하여 스택에 저장

4. 비교가 다 끝나면, 마지막 과제의 시간이 무한이기 때문에 결국 스택이 비어지게 된다. (마지막 과제는 비교 X)

 

 

 

const chgTime = (time) => {
    const [h,m] = time.split(":")
    return +h*60 + +m
}

function solution(plans) {
    plans = plans.map(el => [el[0],chgTime(el[1]),+el[2]]).sort((a,b) => a[1]-b[1])
    plans.push(["infi",999999,99999]) 
    const ret = [];
    const stk = [];
    
    for (let i=0 ; i<plans.length-1 ; i++){
        const [subj,s,t] = plans[i]
        const [nSubj,nS,nT] = plans[i+1]
        let rTime = nS-s-t
        if (0<=rTime){
             ret.push(subj)
             while (rTime && stk.length){
                 if (stk[stk.length-1][1] > rTime) {
                     stk[stk.length-1][1] -=rTime
                     rTime = 0
                 } else  {
                     ret.push(stk[stk.length-1][0])
                     rTime -= stk.pop()[1]
                 }
             }
        } else stk.push([subj,-rTime])
    }
    
    while (stk.length) ret.push(stk.pop()[0])
    
    return ret;
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 리코쳇 로봇  (0) 2023.05.19
[JS] 광물 캐기  (0) 2023.05.18
[JS] 연속된 부분 수열의 합  (1) 2023.05.16
[JS] 두 원 사이의 정수쌍  (1) 2023.05.16
[JS] 요격 시스템  (0) 2023.05.16