[프로그래머스] 기능 개발 2
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42842
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
리스트를 큐로 사용해서 계산한다.
현재 우선순위가 가장 높은(가장 앞에 있는) 작업의 진도를 본다. 진도가 100이상인 경우 배포할 수 있지만, 그렇지 않은 경우 작업이 더 진행되어야 한다. 따라서 가장 앞에 있는 작업의 진도가 100보다 작은 경우 계속 작업을 진행한다.
[95, 90, 99, 99, 80, 99] → [96, 91, 100, 100, 81, 100] → [97, 92, 101, 101, 82, 101] → [98, 93, 102, 102, 83, 102] → [99, 94, 103, 103, 84, 103] → [100, 95, 104, 104, 85, 104]
* 1개의 작업을 배포할 수 있게 됨
* 작업이 100%를 넘어서 101%, 102%와 같이 진행되지는 않겠지만, 어차피 배포할 수 있기 때문에 전혀 중요하지 않음
첫 번째 작업이 배포될 수 있게 되는 순간, 뒤에 이어서 배포할 수 있는 작업을 탐색한다. 여기서는 그 다음 작업은 완료되지 않았기 때문에 첫 번째 작업만 배포할 수 있다.
> 배포하고 난 후의 작업은 전혀 고려할 필요가 없기 때문에 progress, speeds에서 모두 제외한 후, 다시 같은 작업을 수행한다. progress에 더 이상 값이 남아있지 않을 때까지 수행하면 된다.
[95, 104, 104, 85, 104] → [96, 105, 105, 86, 105] → [97, 106, 106, 87, 106] → [98, 107, 107, 88, 107] → [99, 108, 108, 89, 108] → [100, 109, 109, 90, 109]
* 3개의 작업을 배포할 수 있게 됨
[90, 109] → ∽ → [100, 119]
* 2개의 작업을 배포할 수 있게 됨
* progress에 남은 작업이 없기 때문에 반복문이 종료됨
Solution
def solution(progresses, speeds):
answer = []
while progresses :
if progresses[0] >= 100 :
cnt = 0
while progresses and progresses[0] >= 100 :
cnt += 1
progresses.pop(0)
speeds.pop(0)
answer.append(cnt)
else :
progresses = [x + add for x, add in zip(progresses, speeds)]
return answer