[Algorithm] 프로그래머스 42586 : 기능개발

Ell!·2021년 10월 24일
0

algorithm

목록 보기
2/5

내 풀이

나름 스택/큐 파트라고 하지만 배열로도 풀 수 있을 것이라고 생각을 했고, 먼저 각 작업의 소요 시간을 계산해보았다. 여기까지는 쉬웠는데, 문제는

[7,3,9]

라고 되어있으면 37에다가 붙여서 

[2,1] 로 출력시키는 것이 어려웠다.

해답

그래서 이것 저것 해보다가 해답을 봐버렸는데, 내가 너무 생각이 자유롭지가 못했다,...

// 일이 얼마나 걸리는지 계산
function howLong(progress, speed){
    return Math.ceil((100 - progress) / speed)
}

function solution(progresses, speeds) {
    let answer = [0]; // 핵심은 시작할 때 0을 넣어주는 것..
    
    let howLongArr = []; 
    for(let i = 0; i < progresses.length; i++){
        howLongArr.push(howLong(progresses[i],speeds[i]))
    }
    
    let maxDay = howLongArr[0]; // 맨 처음 작업을 maxday로 두고서
    
    for(let i = 0, j = 0; i < howLongArr.length; i++){
        if(howLongArr[i] <= maxDay){ // 이번 작업이 긴 작업보다 짧으면
            answer[j] += 1; 
        } else { // 만약 더 오래걸리는 작업이 나왔으면
            maxDay = howLongArr[i]; // 새로 바꿔주고
            answer[++j] = 1; // answer[++j] 센스 무엇..😃
        }
    }

큐로 푼 풀이를 해석해보는 시간도 가져보았따.

// 시간의 흐름을 실시간으로 추적해주는 시스템이었따.

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

    while(speeds.length > 0) { // 개발이 완료되면 하나씩 빼줄 것이라서
        // 개발
        for(let i in speeds) {
            if(progresses[i] < 100) {
                progresses[i] += speeds[i];
            }
        } // 하루에 이루어지는 개발의 양+;

        // 배포
        let deploy_count = 0; // 이날 배포되는 작업 개수
      	// 만약 맨 앞의 것이 작업완료면 빼주고 count++; 
      	//진작에 끝난 것들은 이미 진작에 100을 넘었을 테니 while문으로 계속 빠질 것음
        while(progresses[0] >= 100) { 
            progresses.shift();
            speeds.shift();
            deploy_count++;
        }
      	// 만약 배포할 것이 있다면 빼주고 answer에 더해줌
        if(deploy_count > 0) {
            answer.push(deploy_count);
        }
    }

    return answer;
}

역시 고수들이 넘 많아

https://programmers.co.kr/learn/courses/30/lessons/42586

profile
더 나은 서비스를 고민하는 프론트엔드 개발자.

0개의 댓글