프로그래머스-기능개발

1 minute read

개요

이번 문제는 문제에 대한 내용만 잘 파악하면 코딩하는데 큰 어려움이 없는 문제였다. 문제는 간단하게 풀었지만 다른사람 풀이를 보던 와중에 좋은 접근법이 있어 정리하고자 한다.

문제 링크

분류

  • Level 2
  • 스택/큐

요점

  • 작업진도가 100%일 때 출시될 수 있음.
  • 배포는 하루에 한번만이며 하루의 끝에 이루어짐(배포 기준 체크 로직이 마지막)
  • 뒤에 있는기능이 먼저 100%를 달성하였다 하여도 앞의 기능이 100%가 아니면 배포될 수 없음. 즉 순차적으로 100%가 되었는지 확인하여야 함.

어려웠던 부분

  • 처음에 빠져나가는순간에 대기중인 트럭이 들어올 수 있는 부분을 생각하지 못하여 좀 헛갈렸음

코드(javascript)

function solution(progresses, speeds) {

    var answer = [];

    while (progresses.length > 0) {
        //기능개발

        for (let progressesCounter = 0; progressesCounter < progresses.length; progressesCounter++) {

            let currentPro = progresses[progressesCounter];

            let currentSpeeds = speeds[progressesCounter];

            progresses[progressesCounter] = currentPro + currentSpeeds;

        }

        let compleJobCnt = 0;

        //기능개발후 진행도 체크

        while(progresses.length > 0){

            if(progresses[0] >= 100){

                progresses.shift();

                speeds.shift();

                compleJobCnt++;

            } else {

                break;

            }
        }

        if (compleJobCnt > 0) {

            answer.push(compleJobCnt);
        }
    }
    return answer;

}
  • 코드 설명 첫번째 for loop에서 speeds 배열를 참조하여 progresses 요소값을 증가시킨다.

  • 두번째 중첩 while문에서 progresses 배열의 첫 번째 요소를 검사한다. 이때 계속 첫번째 요소만을 검사하는 이유는 문제 조건에서 첫 번째 작업이 100%를 달성하여야 출시가 가능하기 때문이다.

  • 마지막 if 조건문에서 완료된 작업 수를 answer 배열에 추가한다.

더 좋은 다른 풀이 코드(javascript)

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;

}



  • 이 코드의 map 함수가 사용된 라인을 확인해보자. 해석하면..

  • 각 작업이 100%를 달성하기위해 얼마의 일수가 필요한지를 계산하는 코드이다.

  • 즉 남은 작업일수를 가지고 작업 완료를 판단하는것이다. 구지 while문을 두번씩이나 중접시키지 않아도 되고 좀더 깔끔한 코드로 작업이 가능한것이다.

  • Math.ceil 함수

Leave a comment