호지

[프로그래머스] 과제 진행하기 문제풀이 JS 본문

알고리즘/프로그래머스

[프로그래머스] 과제 진행하기 문제풀이 JS

_hoji

우선 주어진 plans는 시간순으로 정렬되어 있지 않기 때문에,

[name, start, playtime]에서 start를 기준으로 정렬을 합니다.

또한 start는 hh:mm의 문자열 형태이기 때문에 계산을 편하게 하기 위해서

분 단위의 숫자로 변환해주는 getTime함수를 구현했습니다.

 

plans에서는 다음과제의 시작 시간이 되면 무조건 해당 과제를 수행해야 합니다.

따라서 plans배열을 0부터 마지막원소 전까지 탐색하면서

현재 과제를 끝냈을 때 시간을 playtime,

다음 과제를 시작했을 때의 시간을 nextStartTime이라 했을때

 

다음과제 시작 전까지 현재 과제를 끝내지 못한다면

대기열 waitingList에 해당 과제의 이름과 남은 시간(playtime -nextStartTime)을 push합니다.

*멈춰둔 과제가 여러개 일 경우엔, 가장 최근에 멈춘 과제를 수행해야하므로 스택

 

다음과제 시작이 현재과제를 끝낸 시간이라 하면

현재 과제는 끝낸 것이므로 answer에 해당 과제의 이름을 push합니다.

 

다음과제 시작 전에 현재 과제를 끝내고 여유 시간이 있다면

waitingList가 비어있지않다면

해당 여유 시간동안 waitigList의 남은 과제들을 수행할 수 있을 만큼 수행하고

끝낸 과제는 answer에 push를,

끝내지 못한 과제는 남은 시간을 업데이트 합니다.

 

이 과정을 plans의 마지막 원소 바로 앞까지 수행을 하게 되면,

제일 마지막 과제는 무조건 시작시간에 맞춰 시작을 하고 과제를 끝내므로

바로 answer에 과제이름을 push하고,

남은 waitingList를 확인해서 가장 최근에 멈춘 과제의 이름부터 순차적으로 answer에 push합니다.

 

function getTime(time) {
  return +time.slice(0, 2) * 60 + +time.slice(3, 5)
}

function solution(plans) {
  let answer = []
  let waitingList = []

  plans.sort((a, b) => (b[1] < a[1] ? 1 : -1))

  for (let i = 0; i < plans.length - 1; i++) {
    let playtime = getTime(plans[i][1]) + +plans[i][2]
    let nextStartTime = getTime(plans[i + 1][1])
    if (playtime > nextStartTime) {
      waitingList.push([plans[i][0], playtime - nextStartTime])
    } else if (playtime === nextStartTime) {
      answer.push(plans[i][0])
    } else {
      answer.push(plans[i][0])
      let leftTime = nextStartTime - playtime
      while (leftTime > 0 && waitingList.length !== 0) {
        let [name, time] = waitingList.pop()
        if (time <= leftTime) {
          answer.push(name)
        } else {
          waitingList.push([name, time - leftTime])
        }
        leftTime -= time
      }
    }
  }
  answer.push(plans[plans.length - 1][0])

  for (let i = waitingList.length - 1; i >= 0; i--) {
    answer.push(waitingList[i][0])
  }
  return answer
}

 

https://school.programmers.co.kr/learn/courses/30/lessons/176962?language=javascript 

 

프로그래머스

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

programmers.co.kr

 

Comments