기능개발(level2)

원용현·2022년 8월 24일
0

프로그래머스

목록 보기
9/49

링크

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

문제

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

각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞의 기능보다 먼저 개발될 수 있지만, 앞의 기능이 모두 개발되어 배포될 때 함께 배포된다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 반환하라.

예제로 이해

작업 진도와 각 작업의 개발 속도는 다음과 같다.
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1]
이 두 배열을 통해서 각 작업이 개발 완료되는데 걸리는 시간을 구하는 것이 가능한데 그 식은 다음과 같다.
완료에 걸리는 시간 = 올림((100 - 현재 작업 진도) / 개발 속도)
따라서 각 작업에 걸리는 시간을 배열로 만들면 [ 5, 10, 1, 1, 20, 1 ]이 나온다.

이것을 통해서 한번 배포에 얼마나 많은 작업이 함께 배포되는지를 계산하면된다.

첫 배포 때 0 인덱스의 작업을 배포하며 1 인덱스의 작업을 함께 배포할 수 없으므로 하나만 배포된다 [1]

두 번째 배포 때 1 인덱스의 작업과 2, 3 인덱스의 작업이 함께 배포 가능하므로 세 개의 작업이 함께 배포된다. [1, 3]

세 번째 배포 때 4 인덱스의 배포와 마지막 5 인덱스의 배포까지 함께 배포가 되므로 두 개의 작업이 함께 배포된다. [1, 3, 2]

따라서 주어진 예제의 반환 값은 [1, 3, 2] 이다.

코드

function solution(progresses, speeds) {
    let arr = []
    let result = []
    let count = 0
    
    progresses.map((el, index) => {
        arr.push(Math.ceil((100 - el) / speeds[index]))
    })
    
    let prev = arr[0]
    
    while(arr.length !== 0) {
        if(prev < arr[1] || arr.length === 1) {
            count++
            result.push(count)
            count = 0
            prev = arr[1]
        }
        else if(prev >= arr[1]) {
            count++
        }
        arr.shift()
    }
    
    return result
}

예제 풀이

progresses.map((el, index) => {
	arr.push(Math.ceil((100 - el) / speeds[index]))
})

가장 먼저 각 작업이 개발되는데 걸리는 시간을 계산해서 새로운 배열에 담아준다. 각 배열의 같은 인덱스에 위치한 값들로 위의 식을 계산해서 담아준다. 주의사항은 나눈 값에 대해서 올림을 진행해서 2.3과 같은 실수에 대해서 소수점 아래에 존재하는 숫자는 하루로 볼 수 있도록 해준다.

while 문을 돌리며 조건에 따라 다른 작업이 이루어지도록 한다. 로직상 가장 앞의 숫자가 뒤에 올 숫자보다 크다면 그 개발 작업은 함께 배포가 가능하다. 따라서 가장 앞에 올 숫자를 저장하는 변수를 하나 만들고, 그 숫자와 이후에 올 숫자들을 비교해서 변수의 숫자가 더 크다면 함께 배포되도록 count++를 진행한다.

만약 앞의 숫자가 뒤에올 숫자보다 작거나 (뒤 우선순위의 작업이 더 오래 걸리거나) 만들어진 배열에 더 이상 비교할 내용이 없다면 반환해줄 배열에 count를 넣어서 한 번 배포에 몇 개의 작업이 함께 배포되는지 알려주도록 한다.

while문이 모두 종료되면 반복문을 돌리면 만들어낸 배열을 return 하도록 한다.

0개의 댓글