ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] 프로그래머스 - 기능개발 (스택, 큐 - Stack, queue )
    Alogorithm 2020. 6. 4. 19:46
    반응형

     

     

    프로그래머스 문제입니다.

    문제 설명

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

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

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

     

     


    제한사항

     

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

     

     


    입출력 


    입출력 설명

    예제 #1

    첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
    두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
    세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다. 

    따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.


    문제풀이

    function solution(progresses, speeds) {
        let answer = []
        // (1)
        let workingDays  = progresses.map((progress, idx) => Math.ceil((100 - progress)/speeds[idx]))
        // (2)
        let count = 1
        let max = workingDays[0]
        
        for (let i = 1; i < workingDays.length; i++) {
            // (3)
            if (workingDays[i] <= max) {
                count++
            } else {
                answer.push(count)
                max = workingDays[i]
                count = 1
            }
            // (4)
            if(i === workingDays.length - 1) answer.push(count)
        }
        return answer
    }

     

    idea: working days 배열과 max day 기준으로 값을 업데이트

    (1) 100(완성)에서 progress(진행도)를 뺀 것을 speeds(속도)로 나눕니다. 그리고 올림한 값을 매핑합니다.

    (2) 첫번째 열은 비교할 대상이 없기 때문에 1로 그리고 Max 값을 첫째 인덱스 기준으로 세팅합니다.

    (3) if: 소요일이 max보다 작거나 같으면 같은 배포주기이기 때문에, 개수를 늘려줍니다.

         else: 그렇지 않다면 count값을 push해줌으로써 배포주기를 끝냅니다.

                 그 후, max 값과 count를 다시 초기화해줍니다.

    (4) 마지막 인덱스일 때, 비교해줄 일이 없기 때문에 마지막 개수를 푸시해줍니다.

    그리고 return!

     

     다른 분들 풀이를 참고해보면 접근은 비슷하나 for loop를 어떻게 활용하느냐에 따라서 조금 더 가독성이 좋은 코드가 되었다.

    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;
    }
    반응형

    댓글

Designed by Tistory.