Bin's Blog

[프로그래머스] Level2 - 과제 진행하기(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 과제 진행하기(Javascript)

hotIce 2023. 11. 15. 13:08
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📝문제 요약

1️⃣ 과제는 시작하기로 한 시작이 되면 시작한다.

2️⃣ 새로운 과제를 시작할 시각이 되었을 때, 기존에 진행 중이던 과제가 있다면 진행 중이던 과제를 멈추고 새로운 과제를 시작한다.

3️⃣ 진행중이던 과제를 끝냈을 때, 잠시 멈춘 과제가 있다면, 멈춰둔 과제를 이어서 진행한다. 

4️⃣ 멈춰둔 과제가 여러 개일 경우, 가장 최근에 멈춘 과제부터 시작한다. 과제를 끝낸 순서대로 이름을 배열에 담아 return해라

 

📚중요 포인트

1️⃣ 처음에 문제를 보자마자 우선순위 큐로 해결해야 하는 문제인 줄 알았다. 그러나 그렇게까지 할 필요가 없다.

2️⃣ 시간 계산을 위해서 시 => 분으로 바꿔야 한다. 그래서 함수를 만들어줬다. 

3️⃣ 진행중인 과제가 현재 시작하려는 과제보다 오래 걸린다면 현재 시작하는 과제의 소요 시간을 진행중인 과제에 더해준다. 

 

✅ 성공 코드

function timeToMin(time) {
    // 인자로 들어온 값이 (00:00)의 형식이니 split 메서드 + 시간 계산을 위해 문자열 => 숫자로 변경
    const [hour, minute] = time.split(":").map(Number);
    
    return hour * 60 + minute;
}

function solution(plans) {
    
    const sortedPlans = plans
      // 과제계획을 돌면서, [과제, 시작시간, 걸리는 시간]을 시간계산을 위해서 함수를 이용해서 바꾼다
      .map(([subject, time, progress]) => [subject, timeToMin(time), Number(progress)])
      // 내림차순으로 정렬
      .sort((a,b) => b[1] - a[1]);
    
    let stack = [];
    // 모든 과제가 끝날때까지 돌아준다.
    while (sortedPlans.length > 0) {
        // 시작 순서가 빠른 순서부터 꺼낸다.
        let [subject, time, progress] = sortedPlans.pop();
        
        // 만약에 진행 중인 과제가 현재 시작하려는 과제보다 크면
        // 진행 중인 과제 + 소요시간
        stack.forEach((val) => {
            if (val[1] > time) {
               val[1] += progress;    
            }
        })
        // [과제, 시작 시간 + 소요시간]을 더해서 다음 계산을 진행한다.
        stack.push([subject, time + progress]);
    }
    // 모든 계산을 마쳤으면 오름차순으로 정렬한 후에 과목만 추출해서 return한다.
    return stack.sort((a, b) => a[1] - b[1]).map((el) => el[0]);
}

 

 

📔느낀점

👉 자료구조를 먼저 생각하지 말고 문제 분석을 해서 자료구조가 필요한지를 고민해보자.

728x90