나름 스택/큐 파트라고 하지만 배열로도 풀 수 있을 것이라고 생각을 했고, 먼저 각 작업의 소요 시간을 계산해보았다. 여기까지는 쉬웠는데, 문제는
[7,3,9]
라고 되어있으면 3을 7에다가 붙여서
[2,1] 로 출력시키는 것이 어려웠다.
그래서 이것 저것 해보다가 해답을 봐버렸는데, 내가 너무 생각이 자유롭지가 못했다,...
// 일이 얼마나 걸리는지 계산
function howLong(progress, speed){
return Math.ceil((100 - progress) / speed)
}
function solution(progresses, speeds) {
let answer = [0]; // 핵심은 시작할 때 0을 넣어주는 것..
let howLongArr = [];
for(let i = 0; i < progresses.length; i++){
howLongArr.push(howLong(progresses[i],speeds[i]))
}
let maxDay = howLongArr[0]; // 맨 처음 작업을 maxday로 두고서
for(let i = 0, j = 0; i < howLongArr.length; i++){
if(howLongArr[i] <= maxDay){ // 이번 작업이 긴 작업보다 짧으면
answer[j] += 1;
} else { // 만약 더 오래걸리는 작업이 나왔으면
maxDay = howLongArr[i]; // 새로 바꿔주고
answer[++j] = 1; // answer[++j] 센스 무엇..😃
}
}
큐로 푼 풀이를 해석해보는 시간도 가져보았따.
// 시간의 흐름을 실시간으로 추적해주는 시스템이었따.
function solution(progresses, speeds) {
var answer = [];
while(speeds.length > 0) { // 개발이 완료되면 하나씩 빼줄 것이라서
// 개발
for(let i in speeds) {
if(progresses[i] < 100) {
progresses[i] += speeds[i];
}
} // 하루에 이루어지는 개발의 양+;
// 배포
let deploy_count = 0; // 이날 배포되는 작업 개수
// 만약 맨 앞의 것이 작업완료면 빼주고 count++;
//진작에 끝난 것들은 이미 진작에 100을 넘었을 테니 while문으로 계속 빠질 것음
while(progresses[0] >= 100) {
progresses.shift();
speeds.shift();
deploy_count++;
}
// 만약 배포할 것이 있다면 빼주고 answer에 더해줌
if(deploy_count > 0) {
answer.push(deploy_count);
}
}
return answer;
}
역시 고수들이 넘 많아