🙌문제설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
☑️나의 풀이
📝슈도코드
날짜 days 배열에 (100-progresses[i])/speeds[i]의 올림처리 ceil
반복문은 이제 forEach 또는 map으로 처리할 수 있다!
cnt를 ans 배열에 push 하고 return 할꺼임
만약에 앞 기능이 뒤 기능보다 크거나 같으면 cnt++
작을경우 days를 누적해 비교하고 cnt 값 push한다. cnt=1로 초기화하고 반복. 안하면 에러남
마지막 남은거 cnt 값 push
function solution(progresses, speeds) {
let ans = [];
let days = progresses.map((el,idx)=>Math.ceil((100-el)/speeds[idx]));
let cnt=0;
for(let i=0; i<progresses.length; i++){
if(days[i]<=days[0]){
cnt++;
}else{
days[0]=days[i];
ans.push(cnt);
cnt = 1;
}
}
ans.push(cnt);
return ans;
}
☑️배운 점
❓다른 사람 코드
let maxDay = days[0];
for(let i = 0, j = 0; i< days.length; i++){
if(days[i] <= maxDay) {
answer[j] += 1;
} else {
maxDay = days[i];
answer[++j] = 1;
}
}
이 부분이 달랐는데, cnt를 쓰지않고 ans[j] += 1 을 사용해 풀이하고
ans[++j] = 1 로 작성해 바로바로 인덱스를 사용해 배열에 값을 삽입하였다.
자바스크립트는 index 범위 밖에서도 에러 없이 돌아가기 때문에 [++j] 로 처리한 것은 매우 배울 점이고, 익숙해 져야 한다.
처음엔 에러가 떠서 미처 생각하지 못한 예외처리 등으로 수도코드를 수정해 나갔다. 다른 사람 풀이의 흐름대로 스무스하게 사고해서 풀고싶다.
이 문제는 스택/큐를 사용하는 문제였는데 JS 로써 push를 쓰면 코드가 오히려 더 길어진다. cnt 초기화, for문 밖에서도 push 해줘야하기 때문이다.
고득점 Kit의 Lv.2 문제를 풀어서 쫄았는데.. 복습이 필요하다!