TIL 63 | 자바스크립트로 알고리즘 (프로그래머스 기능개발 JS)

Gom·2021년 4월 26일
0

Algorithm

목록 보기
32/48
post-thumbnail

문제 바로가기

문제 요건

  • 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성
  • 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포

접근방식

queue(FIFO)의 특성을 활용하여 풀어야 하는 문제이다.

1차) 1차 접근 시에는 덧셈 progresses[i]+=speeds[i];이 아닌 나눗셈Math.ceil((100-progresses[i])/speeds[i]);으로 작업이 끝나기까지 남은 일수를 구하고 그 값들은 한 배열 안에 넣어 비교하려 했으나 배열을 만들 때와 배열 내부 비교에 사용되는 for문이 과도한 듯 하여 다른 방식을 시도하였다.

2차) 그 결과 가장 앞에 위치하는 작업이 완료되는 때에 뒤에 위치한 요소들 중 조건을 충족하는 경우를 모두 shift처리하는 식으로 비교 대상을 줄여나갔다.


정답 코드

function solution(progresses, speeds) {
    let answer = [];
    let doneList = [];
    
    while(progresses.length>0){
        for(let i=0;i<progresses.length;i++){
            progresses[i]+=speeds[i];
        }
        if(progresses[0]>=100){
            for(let i=0;i<progresses.length;i++){
                if(progresses[i]>=100){
                    doneList.push(progresses[i]);
                }else{
                    break;
                }
            }
            answer.push(doneList.length);
            while(doneList.length>0){
                progresses.shift();
                speeds.shift();
                doneList.shift();
            }
        }
    }
    return answer;
}

코드 풀이

 for(let i=0;i<progresses.length;i++){
            progresses[i]+=speeds[i];
        }

가장 앞에 위치한 작업이 완성되어 배포 가능 상태가 될 때까지 진도율에 개발 속도를 더해나간다.

if(progresses[0]>=100)
  for(let i=0;i<progresses.length;i++){
                if(progresses[i]>=100){
                    doneList.push(progresses[i]);
                }else{
                    break;
                }
            }

배포 가능 상태가 되면 뒤에 있는 요소들을 확인하여 진도율이 100%를 넘었다면 doneList에 push한다. 100%미만의 작업을 만나면 반복문을 종료한다.
doneList(배포 가능한 작업)의 길이를 answer 배열에 push하고 doneList의 길이만큼 progresses와 speeds, doneList의 요소를 제거한다. 이 때 요소는 FIFO로 진행되어야 하므로 shift를 이용한다.

profile
안 되는 이유보다 가능한 방법을 찾을래요

0개의 댓글