본문 바로가기
ALGORITHM/프로그래머스 With JS

[프로그래머스] 기능개발 / Javascript

by LAY CODER 2021. 4. 30.

문제

 

코딩테스트 연습 - 기능개발

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

programmers.co.kr


 

TRY

function solution(progresses, speeds) {

    // 진행중인 작업이 0이 아닐 동안
    while (progresses.length) {
        // 첫번 째 개발이 끝나기 까지 필요한 날짜
        const needDay = Math.ceil((100 - progresses[0]) / speeds[0]);
        // 필요한 날짜 * 개발 속도 만큼 일을 진행시킴
        const proceed = progresses.map(
            (progress, index) => progress + needDay * speeds[index],
        );

        // 개발 완료 된 작업 수 초기화
        let finished = 0;
        for (let i = 0; i < proceed.length; i++) {
            // 만약 진행률이 100% 이상이면 진행중인 작업과 속도를 없애줌
            if (proceed[i] >= 100) {
                progresses.shift();
                speeds.shift();
                finished++;
            } else {
                // 100% 미만인 작업이 있으면 멈춤
                break;
            }
        }
        answer.push(finished);
    }

    return answer;
}

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

 

진행중인 작업이 있을 동안 while문을 돌리고

 

첫 번째 개발이 끝나기 까지 필요한 날짜를 남은 완성도를 속도로 나눈 값에 Math.ceil() 을 이용해서 구해준다.

 

Array.map() 을 이용하여 첫번째 개발에 필요한 날짜만큼 일을 진행시킨다.

 

진행시킨 개발작업 배열을 for문으로 첫 요소부터 확인하여 진행률이 100%이면

 

해당 작업과 초를 Array.shift()를 이용하여 삭제한다.

 

100%미만이면 for문을 멈추고 while문을 진행시켜 완성 된 작업이 몇 개인지 answer 배열에 넣어준다.

 


 

Refactoring

function solution(progresses, speeds) {

    let answer = [0];

    // needDay = 개발에 필요한 날짜의 배열
    let needDay = progresses.map((progress, index) =>
        Math.ceil((100 - progress) / speeds[index]),
    );
    // 개발에 필요한 최대 날짜를 needDay[0]으로 초기화
    let maxDay = needDay[0];

    for (let i = 0, j = 0; i < needDay.length; i++) {
        // 개발에 필요한 날짜가 최대 날짜보다 낮으면
        // 이미 개발 된 것이기 때문에
        if (needDay[i] <= maxDay) {
            // 정답배열에 1을 더해준다.
            answer[j] += 1;
        } else {
            // 최대날짜를 필요한 날짜로 초기화 하고
            maxDay = needDay[i];
            // 정답 배열 다음 칸에 1을 넣어준다.
            answer[++j] = 1;
        }
    }

    return answer;

}

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

 

개발에 필요한 날짜의 배열(needDay)을 만들고 개발에 필요한 최대 날짜를 배열의 첫 요소로 초기화한다.

 

needDay를 for문을 이용하여 해당요소가 개발 되었으면 answer 요소를 1 더해주고

 

개발이 덜 되었으면 다음 요소에 1을 더해주는 식이다.

댓글