본문 바로가기

프로그래밍 언어/Javascript

[프로그래머스 코딩테스트 연습] 스택/큐 4. 기능개발 (Javascript 자바스크립트)

스택/큐 

4. 기능 개발 (자바스크립트)


문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요

 

 

제한사항

 

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

솔루션 소스코드 

function solution(progresses, speeds) {
 
    let answer = [0];
    let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
    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;
        }
    }

    return answer;
}
  • [index]번째 progress가 100에 도달, 즉 기능 개발이 완료되기 위해 남은 진행 사항을 하루동안 개발할 수 있는 정도를 의미하는 speeds[index]로 나눠주면 해당 progress 개발을 완료하는데 추가적으로 필요한 개발 일수가 나옵니다. 
  • 이때, 필요한 개발 일수가 딱 떨어지지 않는 경우 나머지 부분도 해결하기 위해서는 하루를 더 추가해야 합니다. 예를 들어 90 퍼센트 진도율에 하루 개발 속도가 3% 라면 (100-90) / 3 = 3.33xxxx 입니다. 그렇다면 3일을 개발하고도 0.33xxxx 를 처리해야 하기 때문에 반올림하여 4일이 소요됩니다. 따라서 Math.ceil을 통해 계산한 값을 반올립해주면 됩니다. 
Math.ceil() : 소수점 이하를 올림 하는 함수
  • 따라서 days에는 각 progress를 완료하기 위해 필요한 개발 일수가 차례대로 저장됩니다. 
  • maxDay는 days의 첫번째 값, 즉, 첫번째 기능이 개발 완료되기 위해 필요한 개발 일수로 초기화해둡니다. 
  • for문의 i는 days의 인덱스를 나타내고, j는 answer의 인덱스를 나타내게 됩니다. 그래서 i를 1씩 증가시키며 모든 days의 요소를 for문을 거칠 수 있도록 하고,  j는 answer에 값이 삽입될 때마다 증가시킵니다.
  • progress가 개발 완료를 위해 필요한 일수를 나타내는 days는 자신이 완료되었다 하더라도 앞 순서의 progress에 필요한 개발 일수가 더 크면 기다렸다가 앞 순서의 기능이 개발 완료된 시점에 함께 배포되어야 합니다. 즉, 앞 순서의 progress가 갖는 days가 자신의 days보다 커야 바로 배포될 수 있는 것이고, 작거나 같다면 기다렸다가 같은날 배포해야 합니다. 
  • 따라서 for문에서 현재 loop에서 처리해야할 days[i]가 maxDay보다 작거나 같으면 앞순서의 기능이 개발되기를 기다렸다가 같이 배포되어야 하므로 answer의 현재 인덱스, 즉, 배포일에 1을 추가시켜 같은날 배포됨을 나타냅니다. 
  • 반면에 maxDay가 현재 days[i]보다 큰 경우, 즉, 앞 순서의 progress의 days[i]가 더 큰 경우는 기다리지 않고 바로 배포할 수 있기 때문에 maxDay를 현재 days[i]로 갱신하고 j를 1 증가시켜 answer에 새로운 배포 날짜의 배포 기능 개수를 나타내는 요소를 추가합니다.
  • 만약 다음 처리할 days[i]가 또 현재 maxDay보다 작거나 같으면 앞 기능의 개발 완료를 기다려야 되니까 현재 answer[j]에 1을 더하고,
  • maxDay보다 크다면 바로 기다리지 않고 바로 배포할 수 있므로 answer[++j]에 요소를 추가해주는 것입니다.

References

 

[프로그래머스/자바스크립트] 기능개발 / 스택큐 Level2

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤

eatdeveloplove.tistory.com