알고리즘

프로그래머스 - 기능개발 (Javascript) 풀이

jaewoo 2024. 6. 9. 17:24

 

 

 

풀이

 

[93, 30, 55] 라는 배열이 주어지고 각 개발 속도는 [1, 30, 5] 이다. 개발 속도를 구하는 식은 

(100 - 현재 개발진행퍼센트) / 개발속도 이다. 93일 경우 (100 - 93) / 1 하면 되는데 이게 나누다가 소수점이 나오는 경우도 계속 발생하기에 Math.ceil 을 통해 올림을 해줘야 한다. Math.ceil((100 - 93) / 1)) 하면 된다. 이렇게 하면 개발완료까지 남은 일수를 모두 구할 수 있고 이걸 map 을 통해 수행한다.

let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));

 

그 다음 특정 변수에 첫번째 개발이 끝날때까지 남은 일수 즉 days의 첫번째 요소를 담는다. 그리고 같은날에 배포할 값들을 그룹화한다.

let maxDay = days[0];
let result = [0]; // 정답으로 리턴할 배열 아직 배포결과 안나와서 0만 넣음

반복문을 통해 maxDay 변수아 days에 있는 요소들을 전부 비교하는데 days 에 있는 요소가 클 경우는 같은날 배포 못하고 다른날 배포를 해야한다. 반대로 작을 경우에는 같은날 배포할 수 있기 때문에 그날 배포할 값에 +1 하고 클 경우는 1을 result배열에 넣으면 된다.

 

for(let i =0; i< dats.length; i++) {
	if(days[i] > maxDay){
    	maxDay = days[i];
        result.push(1); // 다른날 배포할 기능 하나 추가
    }else {
    	result[result.length - 1]++; // 배열에 마지막 값이 그룹화된 배포기능들
    }
}

 

 

전체코드

function solution(progresses, speeds) {
    let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
    let maxDay = days[0];
    let result = [0];
    
    for (let i = 0; i < days.length; i++) {
        if (days[i] > maxDay) {
            maxDay = days[i];
            result.push(1);
        } else {
            result[result.length - 1]++;
        }
    }
    
    return result;
}