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

김현수·2023년 11월 18일
0

cdt

목록 보기
25/51


⭐ 스택 / 큐 문제 정리 & 해석


@ 기능개발

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

또, 각 기능의 개발속도는 모두 다르기 때문에

  • 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발 가능
  • 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포

  • 먼저 배포되어야 하는 순서대로
    작업의 진도가 적힌 정수 배열 progresses

  • 각 작업의 개발 속도가 적힌 정수 배열 speeds

    각 배포마다 몇 개의 기능이 배포되는지를 return


< 예시 >

progresses	    speeds	    return
[93, 30, 55]	[1, 30, 5]	[2, 1]

progresses	                speeds       	    return
[95, 90, 99, 99, 80, 99]	[1, 1, 1, 1, 1, 1]	[1, 3, 2]

* 큐를 사용한 코드

function solution(progresses, speeds) {
    var answer = [];
    let days = 1;
    let cnt = 0;
    let progress = 0;
    
    while (progresses[0]) {
        progress = progresses[0] + (speeds[0] * days);
        if (progress >= 100) {
            cnt++;
            progresses.shift();
            speeds.shift();
        } else {
            if (cnt > 0) {
                answer.push(cnt);
            }
            days++;
            cnt = 0;
        }
    }
    answer.push(cnt);
  
	return answer;
}

* 해석

# 큐를 이용한 FIFO 

days     : 배포일
cnt      : 해당 배포일에 배포할 기능 개수
progress : 작업 진도


[코드 해석]
* 마지막 개발을 끝낼 때 까지 반복

  * 작업 진도 계산
  * 작업 100 이상이면

    * cnt + 1
    * progresses 맨 앞 방출
    * speeds 맨 앞 방출
  
  * 작업 100 미만이면
  
    * cnt 가 0 보다 크면
      * 배포일 cnt 등록
      
    * days + 1
    * cnt = 0
 
* 마지막 배포일의 개수 등록

* 나의 코드

function solution(progresses, speeds) {
    const days = progresses.map((progress, index)
                                => Math.ceil((100 - progress) / speeds[index]));
    
    const answer = { maxDay : days[0], nth: 0, dates: [0] };
    
    return days.reduce((acc, cur) => {
        if (cur <= acc.maxDay) {
            acc.dates[acc.nth] += 1;
        } else {
            acc.maxDay = cur;
            acc.nth += 1;
            acc.dates[acc.nth] = 1;
        }
        return acc;
    }, answer)["dates"];
}

* 해석

# Javascript 의 내장 기능 Map, Reduce 를 이용한 풀이 

days     : 배포일 남은 일자 배열
answer   : reduce 의 필요 객체 초기값
 - maxDay   : 배포 전 남을 일자가 제일 긴 일자
 - nth      : 배포가 완료된 배포일 개수
 - dates    : 배포일에 배포되는 기능 개수 [ 반환 값 ]


[코드 해석]
* progresses 와 speeds 를 계산한 
  남은 일자 계산 후 days 배열 반환

* 배열의 누적 계산 

  * 현재 순서에 남은 일자가 maxDay 이상이면
  	
    * acc.dates[acc.nth] += 1
    
  * 현재 순서에 남은 일자가 maxDay 미만이면 
      
    * acc.maxDay = cur
    * acc.nth += 1
    * acc.dates[acc.nth] = 1
 
  * 객체에 dates 반환
profile
일단 한다

0개의 댓글