JS Star 블로그

기억보다는 기록을✏️ 머신러닝, 웹개발, 물리학을 공부했고 계속 배워가고 있습니다.
📌 기존에 포스팅하던 블로그에서 포스트를 옮기는 중입니다.

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

11 Nov 2020 » algorithm

기능개발

문제

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

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한사항

작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력 예

progresses,	speeds, return
[93, 30, 55]	[1, 30, 5]	[2, 1]
[95, 90, 99, 99, 80, 99]	[1, 1, 1, 1, 1, 1]	[1, 3, 2]

풀이

맨 앞에 있는 작업율이 100%가 아니면 뒤에 있는 작업을 마칠 수 없다. 설명에서 볼 수 있듯이 queue를 사용하면 된다. 파이썬에서 더 편하게 불러오고 사용할 수 있는 deque 을 사용하여 풀어보자. 먼저 하루에 향상 시킬 수 있는 작업량을 각 요소에 더해주는 작업이 필요하다. 그리고 더하기 전에 맨 앞에 있는 작업이 100%인지 확인하고, 뒤에 연속해서 100% 이상인 작업이 있는지 확인한다. 그리고 연속된 100%의 작업을 모두 pop 해준다.

import collections

def solution(progresses, speeds):
    # 앞에 있는 기능이 완성되지 않으면 없앨 수 없음
    
    answer = []
    
    progresses = collections.deque(progresses)
    speeds = collections.deque(speeds)
    
    # 모든 배열에 차례대로 더하기 수행
    while len(progresses):
        cnt = 0
        while len(progresses) and progresses[0] >= 100:
            progresses.popleft()
            speeds.popleft()
            cnt += 1
        
        # 각 progresses 성능향상
        for i, s in enumerate(speeds):
            progresses[i] += s
        
        if cnt > 0:
            answer.append(cnt)
        
    return answer