알고리즘, 자료구조/프로그래머스
[Javascript] 프로그래머스 기능 개발
jaee
2020. 6. 26. 14:20
문제
https://programmers.co.kr/learn/courses/30/lessons/42586#
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 ��
programmers.co.kr
작업 진도, 작업 속도가 주어지고 둘의 합이 100 이상 되어야 배포가 가능하다. 또한 뒷 작업이 먼저 완료되었다 하더라도 앞 작업이 배포되어야 뒷 작업도 배포될 수 있다. 즉, 뒷 작업이 앞에 작업보다 먼저 배포될 수 없다. 큐 개념을 이용해 문제를 풀었고, 배포된 작업들은 배열에서 삭제되기 때문에 시간 복잡도는 O(log n)이 되지 않을까 생각한다. 이 문제에서 생각해야 될 부분은 앞 작업이 배포될 때까지 뒷 작업은 배포될 수 없는 것, 모든 작업은 하루에 각 작업 속도만큼 진행이 된다는 것이다.
풀이 방법
function solution(progresses, speeds) {
let result = [];
let doneList = [];
// progresses 내 요소가 없어질 때까지
while(progresses.length > 0){
// 현재까지의 구현 단계와 구현 속도를 더한다
for(let i = 0; i < progresses.length; i++){
progresses[i] += speeds[i];
}
// 맨 앞 작업의 구현 단계가 100 이상이라면
if(progresses[0] >= 100){
// 맨 앞 작업 ~ 마지막 작업까지 구현 단계가 100 이상인 것들을 찾는다
for(let i = 0; i < progresses.length; i++){
// 100 이상이라면 doneList에 저장한다
if(progresses[i] >= 100){
doneList.push(progresses[i]);
// 중간에 구현 단계가 100미만의 작업이 나온다면 break로 탈출한다
}else{
break;
}
}
// result에 몇 개 작업이 완료-배포되었는지 저장하고,
result.push(doneList.length);
// doneList, progresses, speeds의 요소들을 앞에서부터 제거한다.
while(doneList.length > 0){
progresses.shift();
speeds.shift();
doneList.shift();
}
}
}
return result;
}
테스트 케이스
[40, 93, 30, 55, 60, 65] [60, 1, 30, 5, 10, 7] [1, 2, 3]
[93, 30, 55, 60, 40, 65] [1, 30, 5, 10, 60, 7] [2, 4]
[93, 30, 55, 60] [1, 30, 5, 40] [2, 2]
[99, 99, 99, 99, 99] [3, 3, 3, 3, 3] [5]
[0, 0, 0, 0] [100, 50, 34, 25] [1, 1, 1, 1]
[5, 5, 5] [21, 25, 20] [3]