일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JS
- 스택
- 이중지도
- 우박수열정적분
- div2개
- solved.ac플래티넘
- 지도 여러개
- 알고리즘문제풀이
- React.StrictMode
- c++
- 과제진행하기
- 최소스패닝트리
- 2023카카오블라인드코테
- [pccp 기출문제]
- 비트마스크
- JS스터디
- 두원사이의정수쌍
- 백준알고리즘
- solved.ac골드
- 5강클로저
- pccp기출문제
- Lv2
- DP
- 프로그래머스
- 백준 알고리즘
- 정렬
- 코어자바스크립트
- 알고리즘 문제풀이
- 타겟넘버
- Lv3
- Today
- Total
호지
[프로그래머스] 과제 진행하기 문제풀이 JS 본문
우선 주어진 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
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 호텔 대실 문제풀이 JS (0) | 2023.08.30 |
---|---|
[프로그래머스] 광물 캐기 문제풀이 JS (0) | 2023.08.29 |
[프로그래머스] 연속된 부분 수열의 합 문제풀이 JS (0) | 2023.08.27 |
[프로그래머스] 두 원 사이의 정수 쌍 문제풀이 JS (0) | 2023.08.27 |
[프로그래머스] 직사각형 별찍기 문제풀이 JS (0) | 2023.08.11 |