[프로그래머스 코딩테스트] 스택/큐 - 기능개발

 Java Script 

[프로그래머스 코딩테스트] 스택/큐 - 기능개발

👉 하루에 한번씩 코딩 실력을 기르기 위해 시작하는 프로그래머스 코딩테스트

👉 코딩테스트 연습 > 스택/큐 > 기능개발

 

문제 설명 및 제한사항

👉 문제

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

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

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

 

👉 제한사항

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

 

정답 및 풀이

👉 정답

function solution(progresses, speeds) {
    let answer = [];

    // step1] 각 프로세스별 완료까지 걸리는 일수 구하기
    let fewDays = [];
    for(key in progresses) {
        // 배포일은 100%가 되었을떄 기준이기 때문에
        // (100 - 프로세스) / 스피드 공식으로 소수점 윗자리 올려서 필요한 배포일수를 구한다.
        fewDays.push(Math.ceil((100 - progresses[key]) / speeds[key]));
    }
    
    // step2] 0번방 기준으로 기준일 설정.
    // 이유는 뒤 프로세스가 아무리 빨리 끝나더라도 0번방 프로세스가 안 끝나면 배포하지 못하기 때문
    let referenceDay = fewDays[0];

    // step3] 로직짜기
    while(fewDays.length) { // fewdays 배열이 존재할 때 까지 루프
        let count = 0; // 배포 카운트
        for(let i in fewDays) { // 각 프로세스별 배포까지 걸리는 날자 for문
            if(fewDays[i] <= referenceDay) { // 배포일이 기준일보다 짧거나 같다면
                count++ //같은날 배포하기 때문에 배포 카운트 ++
            }else { // 배포일이 기준일보다 길다면
                answer.push(count); //기존에 배포 카운트를 먼저 배포하기 때문에 answer에 push
                fewDays.splice(0,count); // 0번방부터 배포카운트까지 splice로 배열 재지정
                referenceDay = fewDays[0]; // 기준일을 재지정한 배열의 0번방으로 설정
                break; // for문 탈출
            }
        }
        if(count == fewDays.length) { 
            // 위의 공식으로는 무한루프 돌기 때문에 마지막 배포에 관련한 루프탈출 로직
            answer.push(count);
            break;
        }
    }
    return answer;
}

 

👉 풀이

  • 주석에 상세히 적어놓았습니다. 참고하세요.

 

 

마무리

👉 스택을 활용하기 위해 push와 pop만 사용하려 했지만 splice를 사용하여 처리하였습니다.