[Algorithm] 기능개발
공부

[Algorithm] 기능개발

작성일: 2023년 10월 17일0

문제설명

기능개발은 기능들의 작업률을 담은 정수 배열 progresses와 각 기능들의 일일 작업 시간을 담은 정수 배열 speeds를 전달받는다. 각 기능은 작업률이 100%를 만족하면 배포가 완료되고 선행되는 작업이 100%가 될 때까지 뒤의 작업은 작업률이 100%라도 먼저 배포되지 않는다. 해당 조건을 만족하여 각 기능의 배포일에 배포되는 기능의 수를 담은 배열을 반환해야 한다.

문제해결

모든 기능들의 배포까지 며칠이 걸리는지 담은 정수 배열을 만든다.

진행률 P, 하루에 진행되는 시간 T일 때 배포 완료일 X는 (100 - P) / T 이다.

만약 4.555..일이면 5일로 처리하기 때문애 소수점이 나오면 올림을 해준다.

배포되는 기능의 수 count는 1로 초기화하고 배포 기준일 maxDay와 days의 요소를 비교하며 순회한다.

function solution(progresses, speeds) {
    let answer = [];
  // 배포완료일
    let days = progresses.map((progress, i) => Math.ceil((100 - progress) / speeds[i]));
  // 배포되는 기능의 수 = 1로 초기화
    let count = 1;
  // days와 비교할 첫 기능의 배포완료일
    let maxDay = days[0];
    
    for (let i = 1; i < days.length; i++) {
      // 선행되는 배포가 다음 배포와 함께 종료될 때
        if (days[i] <= maxDay) {
            count++;
      // 선행되는 배포가 완료되고 다음 배포가 진행될 때
        } else {
          // 비교할 배포완료일을 다음 배포로 교체 후 선행되는 배포의 count를 저장하고 초기화
            maxDay = days[i];
            answer.push(count);
            count = 1;
        }
    }
  // 마지막 배포될 기능의 수를 저장
    answer.push(count);
    return answer;
}

이상적인 코드

많은 추천을 받은 코드로 가독성과 언어 활용도를 모두 잡았다.

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;
}

for문에 변수 두 개를 선언하는 방법과 answer[0] = 0으로 초기화한 방법은 잘 사용해보지 않았지만 코드를 작성하면서도 햇갈리지 않을 것 같다.