본문 바로가기
  • 살짝 구운 김 유나
Algorithm/Programmers

[Lv.2] 과제 진행하기 - JavaScript

by yunae 2023. 4. 22.

문제

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이

(programmers의 질문하기 답변 참고)

1. 과제 목록의 시간을 분단위의 숫자로 변환하여 시작시간이 빠른 순서대로 정렬한다.

2. 현재 시간을 1분씩 증가시키면서

2-1. 시작해야 할 과제가 있다면 스택에 삽입한다

2-2. 그렇지 않다면 스택의 맨 마지막 원소 과제를 1분씩 진행한다. 이때, 진행중인 과제가 완료되면(시간이 0이 된 경우) 과목명을 answer에 추가한 후 pop!

3. 완료된 과제의 수가 plans의 길이와 같아지면 반복문을 종료한다.

 

 

코드

function solution(plans) {
  var answer = [];
  let hash = {};

  plans.forEach((plan) => {
    plan[1] = stringToTime(plan[1]);
    plan[2] = Number(plan[2]);
    hash[plan[1]] = [plan[0], plan[2]];
  });

  // 시작 시간이 빠른 순서대로 정렬
  plans.sort((a, b) => a[1] - b[1]);

  let now = plans[0][1]; // 현재 시간
  let stack = []; // 해야하는 과제 목록
  let done = 0;  // 완료한 과제의 수
  // 주어진 과제를 모두 마칠 때까지
  while (done < plans.length) {
    // 해야할 과제가 있다면
    if (stack.length) {
      // 가장 먼저 해야할 과제를 1분씩 수행
      stack[stack.length - 1][1]--;
      // 현재 진행중인 과제가 완료되는 시점에
      if (stack[stack.length - 1][1] === 0) {
        // 완료한 과제의 과목명을 answer에 추가
        answer.push(stack[stack.length - 1][0]);
        stack.pop();
        // 완료한 과제의 수를 1 증가 시키기
        done++;
      }
    }
    // 시작해야하는 과제가 있다면 stack에 삽입
    if (hash[now]) stack.push(hash[now]);
    // 1분씩 증가
    now++;
  }

  return answer;
}

// 시간 문자열을 분단위로 변환
const stringToTime = (str) => {
  const [hour, minute] = str.split(":").map(Number);
  return hour * 60 + minute;
};

 

 

 

댓글