알고리즘

[웅's 프로그래머스] 기능개발 - 파이썬(python) 풀이

CodeBoyEd 2021. 9. 25. 20:34

이번 시간에는 "프로그래머스 고득점 kit" "스택/큐" 카테고리에 있는 기능개발 문제를 풀어보겠습니다.

 

먼저, 진행율과 속도 배열을 이용하여 모든 작업의 남은 일수를 구합니다.

 

남은 일수를 구하는 식은 100% 에서 현재 진행상황인 progress 값을 뺀 후, 속도인 speed 값으로 나눠준 후 올림을 해주는 것 입니다. 

 

만약 아래의 예시의 경우 다음과 같은 결과가 나옵니다.

progresses = [95, 90, 99, 99, 80, 99]
speeds = [1, 1, 1, 1, 1, 1]
costs = [math.ceil((100-p)/s) for p,s in zip(progresses, speeds)]
# costs = [5, 10, 1, 1, 20, 1]

costs 를 순회하며 가장 큰 수의 경우 현재 날짜 변수 now 로 설정해주고 만약 입력 값이 now 보다 작을 경우에는 이미 작업이 완료된 경우 이므로 stack에 담습니다. 

 

now 보다 큰 경우에는 이전 작업들이 한 번에 끝났음을 의미하고 다음 작업을 기다리는 상황이므로 stack 에 담겨진 elements 개수들을 answer 배열에 추가하고 stack 을 초기화 합니다.

 

마지막에 계산되지 않은 stack 이 있을 경우 answer 에 추가해주는 코드를 넣었습니다. 

import math

def solution(progresses, speeds):
    answer = []
    stack = []
    costs = [math.ceil((100-p)/s) for p,s in zip(progresses, speeds)]
    now = costs[0]
    for i in range(len(costs)):

        if len(stack)!=0 and now < costs[i]:
            answer.append(len(stack))
            stack = [costs[i]]
            now = costs[i]
        else :
            stack.append(costs[i])
    
    if len(stack) != 0 :
        answer.append(len(stack))

    return answer