배포해야할 기능의 작업 진도가 담긴 배열 progresses와 개발 속도가 담긴 speeds가 주어졌을 때, 각 배포마가 몇 개의 기능이 배포되는지 return한다.
단, 각 기능은 앞의 기능이 배포되기 전 까지는 배포될 수 없다.
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
에 넣었다.
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
보다 작거나 같으면 배포하면서 몇개인지 센다.
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)