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

nayeoniee·2021년 9월 21일
0

Algorithm

목록 보기
25/29

문제

문제 링크

배포해야할 기능의 작업 진도가 담긴 배열 progresses와 개발 속도가 담긴 speeds가 주어졌을 때, 각 배포마가 몇 개의 기능이 배포되는지 return한다.
단, 각 기능은 앞의 기능이 배포되기 전 까지는 배포될 수 없다.

코드

  1. 기능별로 작업을 완료하는데 며칠이 소요되는지 구한다.
import math
from collections import deque

def solution(progresses, speeds):
    days = []
    for i in range(len(progresses)):
        day = math.ceil((100 - progresses[i]) / speeds[i])
        days.append(day)
    days_deque = deque(days)
    print("len: ", len(days_deque))

예를 들어 작업 진도가 95이며, 속도가 4인 기능을 완료하는데 2일이 걸린다.
(100-진도) / 속도 값을 올림하면 작업을 완료하는데 걸리는 일수를 구할 수 있다.
올림하기 위해 math.ceil()를 사용했다. 처음에 math.round()를 사용했다가 테스트 케이스 몇개를 실패했는데, math.round()반올림 함수이다.!!
기능별로 소요되는 일수 day를 구한 후 days 리스트에 append한다.
기능별로 소요되는 일수가 담긴 days 리스트의 요소를 왼쪽부터 제거하는 popleft()를 사용하기 위해 데크 타입의 변수 days_deque에 넣었다.

  1. 한번에 배포되는 기능 개수 세기
answer = []
while len(days_deque) > 0:
    # 가장 왼쪽(첫 번째) 기능 배포
    cnt = 1
    num = days_deque.popleft()

    while len(days_deque) > 0 and days_deque[0] <= num:
        cnt += 1
        days_deque.popleft()
    answer.append(cnt)

앞의 기능이 배포되기 전까지 다음 기능을 배포할 수 없다.
우선 가장 왼쪽(첫 번째) 기능을 배포하고, 다음 기능이 배포한 기능의 day보다 작거나 같으면 배포하면서 몇개인지 센다.

전체 코드

github

import math
from collections import deque

def solution(progresses, speeds):
    days = []
    for i in range(len(progresses)):
        day = math.ceil((100 - progresses[i]) / speeds[i])
        days.append(day)
    days_deque = deque(days)


    answer = []
    while len(days_deque) > 0:
        cnt = 1
        num = days_deque.popleft()

        while len(days_deque) > 0 and days_deque[0] <= num:
            cnt += 1
            days_deque.popleft()
        answer.append(cnt)

    return answer

progresses = [93, 30, 55]
speeds = [1, 30, 5]

res = solution(progresses, speeds)
print("res: ", res)
profile
정말 할 수 있어!

0개의 댓글