문제
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;
};
'Algorithm > Programmers' 카테고리의 다른 글
[Lv.2] 주차 요금 계산 - JavaScript (0) | 2023.05.09 |
---|---|
[Lv.2] 이모티콘 할인행사 - JavaScript (0) | 2023.05.08 |
[LV.2] 요격시스템 - JavaScript (0) | 2023.04.17 |
[Lv.2] 리코쳇로봇 - JavaScript (0) | 2023.04.17 |
[Lv.2] 미로 탈출 - JavaScript (0) | 2023.04.11 |
댓글