프로그래머스 기능개발 코드 및 해설 (파이썬)

2021. 6. 2. 02:58algorithm

반응형

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

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

우선 durations라는 리스트에 각 작업별로 완료까지 며칠이 걸리는지 저장했습니다. 이는 (100-현재 progress 상태) / 해당 작업의 speed를 반올림한 값으로 구했습니다.

이후 기능은 작업 완료되었으나, 이전 기능이 완료되지 않아 아직 배포할 수 없는 경우, 이때의 이전 기능이 작업 완료까지 걸리는 시간은 waiting_to_finish에 저장합니다. 처음엔 durations의 첫번째 요소로 이 값을 초기화합니다.
count엔 하루에 배포할 기능의 개수를 저장하고, 다음날이 되면 다시 1로 초기화합니다.

durations의 값을 하나씩 받으면서 현재 작업이 이전 기능의 작업 완료 시점보다 오래 걸리면 이전 기능을 먼저 배포합니다. (answer에 현재 count 값을 추가하고, count를 1로 초기화합니다)
반대로 현재 작업이 이전 기능의 작업 완료 시점보다 일찍 완료되면 이전 기능이 완료될 때까지 기다립니다. (count를 1만큼 증가시킵니다)

마지막 작업은 answer에 반영되지 못했으므로, for 문을 빠져나온 이후의 count를 answer에 추가합니다.

 

import math 

def solution(progresses, speeds):
    # 작업 완료까지 걸리는 시간 
    durations = []
    for progress, speed in zip(progresses, speeds):
        # 반올림 
        share = int(math.ceil((100-progress)/speed))
        durations.append(share)
        
    # 작업은 완료되었으나, 이전 기능이 완성된 상태가 아니라서 아직 배포하지 못하는 경우
    # 이때의 이전 기능의 작업 완료까지 걸리는 시간
    waiting_to_finish = durations[0]


    answer = []
    count = 1 
    for i in range(1, len(durations)):
        # 이전 기능의 작업 완료까지 걸리는 시간보다 현재 기능의 작업 시간이 더 오래 걸리는 경우, 일단 이전 기능들 배포 
        if waiting_to_finish < durations[i]:
            answer.append(count)
            count = 1 
            waiting_to_finish = durations[i]
        # waiting_to_finish >= durations[i]
        # 이전 기능의 작업 완료까지 걸리는 시간보다 현재 기능의 작업 시간이 더 적게 걸리는 경우, 이전 기능이 작업 완료될 때까지 기다렸다가 같이 배포 
        else:
            count += 1 
    
    # 마지막 count 추가 
    answer.append(count)
        
            
    return answer
반응형