Coding Problem

[프로그래머스] 과제 진행하기

Yepchani 2024. 12. 29. 10:00
반응형

문제

과제 진행하기

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

 

풀이

설명

과제를 끝낸 순서대로 이름을 구하는 문제입니다.

 

과제를 시작 시간 순서로 정렬합니다.

각 과제에 대해서 다음 작업들을 반복합니다.

  • 현재 시간이 다음 과제 시작 시간보다 작을 경우
    • 스택에서 최근 과제를 꺼내 다음 과제까지 남은 시간내에 해결할 수 있는지 판단합니다.
      • 해결 가능할 경우, 완료 목록에 추가하고 현재 시간을 (현재 시간 + 남은 과제 시간)으로 업데이트 합니다.
      • 불가능할 경우, 해당 과제를 다시 스택에 추가하고 현재 시간을 다음 과제의 시작 시간으로 업데이트합니다.
  • 스택에 과제를 추가하고, 현재 시간을 해당 과제의 시작 시간으로 업데이트합니다.

 

예시 코드

function solution(plans) {
  const MINUTES_IN_HOUR = 60;

  const answer = [];
  const stack = [];
  let currentTime = 0;

  plans.sort((a, b) => a[1].localeCompare(b[1]));

  for (const [name, startTime, duration] of plans) {
    const [startHour, startMinute] = startTime.split(":").map(Number);
    const startInMinutes = startHour * MINUTES_IN_HOUR + startMinute;
    const durationInMinutes = Number(duration);

    while (currentTime < startInMinutes) {
      if (stack.length === 0) break;

      const [topName, topDuration] = stack.pop();
      const remainingDuration = topDuration - (startInMinutes - currentTime);

      if (remainingDuration > 0) {
        stack.push([topName, remainingDuration]);
        currentTime = startInMinutes;
      } else {
        answer.push(topName);
        currentTime += topDuration;
      }
    }

    stack.push([name, durationInMinutes]);
    currentTime = startInMinutes;
  }

  while (stack.length > 0) {
    const [topName, topDuration] = stack.pop();
    answer.push(topName);
  }

  return answer;
}