[4주차 기본문제 1] 기능개발

BossTeemo·2024년 7월 11일
0

알고리즘스터디

목록 보기
11/19
post-thumbnail
post-custom-banner

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있지만, 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

주어진 progresses 배열과 speeds 배열을 사용하여 각 배포마다 몇 개의 기능이 배포되는지를 구하는 함수를 완성해야 합니다.

제한 사항

  • 작업의 개수는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다.

입출력 예

  • 입력: [93, 30, 55], [1, 30, 5]
  • 출력: [2, 1]

첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 첫 번째 기능이 배포되는 7일째 함께 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.


문제 해결 방법

  1. 각 기능이 완료되기까지 남은 일수를 계산합니다.
  2. 배포 시점을 결정하고 각 배포마다 몇 개의 기능이 배포되는지를 계산합니다.

해결 전략

각 기능의 완료 일수를 계산하고, 이를 기반으로 배포 시점을 결정합니다. 첫 번째 기능의 완료 일수를 maxDay로 설정하고, 현재 기능이 maxDay보다 작거나 같으면 같은 날 배포할 수 있으므로 count를 증가시킵니다. 그렇지 않으면 새로운 배포 시점이 되므로 현재 countanswer 배열에 추가하고, count를 다시 1로 설정한 후, maxDay를 현재 기능의 완료 일수로 업데이트합니다.

코드 구현

function solution(progresses, speeds) {
    var answer = [];
    var days = progresses.map((progress, index) => {
        return Math.ceil((100 - progress) / speeds[index]);
    });

    var maxDay = days[0];
    var count = 1;

    for (var i = 1; i < days.length; i++) {
        if (days[i] <= maxDay) {
            count++;
        } else {
            answer.push(count);
            count = 1;
            maxDay = days[i];
        }
    }

    answer.push(count);
    return answer;
}

코드 설명

  1. progressesspeeds 배열을 순회하며 각 기능이 완료되기까지 남은 일수를 계산하여 days 배열에 저장합니다.
  2. days 배열을 순회하며 첫 번째 기능의 완료 일수를 maxDay로 설정하고, 이후 기능들의 완료 일수를 비교하여 같은 날 배포할 수 있는 기능의 수를 count로 계산합니다.
  3. maxDay보다 큰 일수가 나타나면 현재까지 계산된 countanswer 배열에 추가하고, 새로운 배포 시점을 위해 countmaxDay를 업데이트합니다.
  4. 모든 기능에 대해 반복한 후 최종적으로 answer 배열을 반환합니다.

입출력 예시 테스트

console.log(solution([93, 30, 55], [1, 30, 5])); // [2, 1]
console.log(solution([95, 90, 99, 99, 80, 99], [1, 1, 1, 1, 1, 1])); // [1, 3, 2]

이 코드는 주어진 예시 입력에 대해 올바른 결과를 출력합니다. 각 기능이 배포되는 시점을 정확히 계산하여 결과를 반환합니다.


결론

이번 포스팅에서는 프로그래머스의 "기능 개발" 문제를 해결하는 방법을 살펴보았습니다. 각 기능의 완료 일수를 계산하고 이를 기반으로 배포 시점을 결정하여 문제를 효과적으로 해결할 수 있습니다. 코딩 테스트를 준비하는 여러분께 도움이 되길 바랍니다. 다음 포스팅에서는 또 다른 문제로 찾아뵙겠습니다. 감사합니다!

profile
1인개발자가 되겠다
post-custom-banner

0개의 댓글