[Algorithm-JS] 프로그래머스 코테 Lv2 - 기능개발(array)
✔️ 문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✔️ 문제요약
배포되어야 하는 작업들이 순서대로 담긴 배열 progresses가 존재하며 각 작업의 값은 배포된 정도를 의미한다. 매일 수행할 수 있는 작업의 속도가 담긴 배열 speeds도 존재한다. 각 작업들은 배포 순서가 존재하기 때문에 먼저 100% 배포 준비가 됐더라도 앞선 작업이 배포 준비가 되지 않는다면 배포가 불가능하다. 배포가 가능한 날에 배포할 수 있는 작업의 개수를 담은 배열을 반환하는 문제이다.
🔴 제한사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하이다.
- 작업 진도는 100 미만의 자연수이다.
- 작업 속도는 100 이하의 자연수이다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정한다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어진다.
🚩 접근법
처음에 접근할 때는 날마다 어떻게 진행할지 직접 적어보고 배포날짜를 계산해봤다.
계산식을 생각해보니 {100-배포된정도}에서 speed를 나누고 올림을 해주면 총 걸리는 날이 나오게된다.
따라서 progresses를 하나씩 순회하여 각 작업마다 배포까지 걸리는 날을 계산하고 deploy라는 배열에 저장하는 작업을 먼저 진행해주고 deploy 배열을 이용하여 답을 얻을 수 있었다.
예시로 나오는 progresses를 보면 [93, 30, 55]이다. 이 작업들이 배포될 날짜를 계산하여 deploy 배열을 만들면 [7, 3, 9]라는 배열이 만들어진다.
나는 답을 위해 answer이라는 배열을 만들어주었고, 먼저 answer에 1을 push하고, curr_day에 deploy[0] 즉, 7을 저장하였다. 이후, deploy배열을 순회하여 curr_day보다 현재 deploy[i]가 더 크면 answer에 1을 push하고 그렇지 않으면 deploy의 마지막 요소에 +1을 해주는 식으로 문제를 해결했다.
(사진은 낙서에 불과합니다. 수학적으로는 맞지 않은 식입니다.)
💡코드
function solution(progresses, speeds) {
let days = [], answer = [];
let deploy = 0;
progresses.forEach((progress, idx) => days.push(Math.ceil((100-progress)/speeds[idx])));
deploy = days[0];
answer.push(1);
for(let i=1; i<days.length; i++){
if(deploy < days[i]){
answer.push(1);
deploy = days[i];
}else {
answer[answer.length-1]++;
}
}
return answer;
}
이렇게 풀고 다른 사람의 풀이를 보니 내 풀이가 나쁘지 않은 풀이임에 기뻤다!