처음에 생각한 풀이는 주석으로 다음과 같이 남겼었다.
스택에 p의 한 개랑 s의 한 개를 뽑아서 더해주다가
p가 100보다 커졌을 때 다음으로 넘어감
대신 넘어갈 시점의 반복수 *s 가 100을 넘은다면 걔도 통과
그렇지 않다면 스피드로 남은 일수를 계산해줌
결론적으로 i가 같지 않게되는 것이니 return값은 증가하게됨
하지만 생각을 해보니 반복일수를 굳이 stack에 담아 배열로 활용할 필요없이 변수로 할용하면 편했었다.
또한, 앞에서부터 완료한 순으로 제거가되니 스택을 활용하는 것이 아니라 큐를 활용하면 더욱 편하게 앞에서부터 제거를 해나갈 수 있다.
어떻게 보면 논리는 비슷했지만 구현하는 접근방식에 있어서 달랐던 것 같다.
큐를 활용한다면 while문 + [0]만을 이용해서 반복문을 돌리다가
shift를 활용하면 되기 때문
function solution(progresses, speeds) {
let answer = [];
while (speeds.length > 0) { // speed 배열길이가 0이 될때까지
let cnt = 0;
for (let i = 0; i < speeds.length; i++) { // progress와 speed 짝지어 더하기
if (progresses[i] < 100) { // 100이 넘어가면 그만 더하기
progresses[i] += speeds[i];
}
}
while (progresses[0] >= 100) { // 맨앞의 progress배열이 100이 넘으면 shift
progresses.shift();
speeds.shift(); // speed도 shift
cnt++; // 빼자마자 다음 애도 100이 넘는다면 while문을 벗어나지 않고 cnt를 증가시킴
}
// while문을 벗어났고 그 값이 0보다 크다면 cnt를 넣어줌
if (cnt > 0) {
answer.push(cnt);
}
}
return answer;
}
function solution(progresses, speeds) {
// answer: 각 배포마다 배포되는 기능의 수가 적힌 정수 배열
var answer = [];
// days: 배포일
let days = 1;
// cnt: 오늘 배포되는 기능의 수
let cnt = 0;
// progress: 현재 기능의 작업 진도
let progress = 0;
// 모든 작업이 다 배포될 때까지 반복
while(progresses[0]){
// 첫 번째 기능의 작업 진도
progress = progresses[0] + (speeds[0] * days);
// 첫 번째 기능의 작업 진도가 100 이상인 경우 배포 완료
if(progress >= 100){
// 배포 완료된 기능 개수 추가
cnt++;
// 배포 완료된 작업 제거
progresses.shift();
// 배포 완료된 작업의 속도 제거
speeds.shift();
}
// 첫 번째 기능의 작업 진도가 100 미만일 경우 배포 불가능
else{
// 배포 완료된 기능이 있는 경우, answer에 push
if(cnt > 0){
answer.push(cnt);
}
// 배포일 증가 (다음날)
// 여기에서 더해준 days값으로 위에 days와 계산
days++;
// 배포 완료된 기능 개수 초기화
cnt = 0;
}
}
// 모든 작업이 다 배포되고 나면, 마지막으로 카운트된 배포 완료 기능 개수 push
answer.push(cnt);
return answer;
}
while[0]을 통한 큐 활용법을 깨닫고 여러 조건문이 동시에 등장 했을 때 실행 순서를 잘 떠올려야할 것 같다 꼭꼭 복습해야할듯