https://programmers.co.kr/learn/courses/30/lessons/42586
from collections import deque
def solution(progresses, speeds):
answer = []
prog = deque(progresses)
spd = deque(speeds)
while prog:
for i in range(len(prog)):
prog[i] += spd[i]
tmp = 0
try:
while prog[0] >= 100:
tmp += 1
prog.popleft()
spd.popleft()
except:
pass
if tmp > 0:
answer.append(tmp)
return answer
각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
각 기능의 개발속도는 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
예시로
입력
progress = [93, 30, 55]
speeds = [1, 30, 5]
3일뒤 두번째 작업은 100%가 되어 배포가 가능해지지만,
그 앞의 첫번째 작업이 96%로, 아직 배포되지 않아 두번째 작업은 기다려야한다.
7일뒤 첫번째 작업은 100%가 되어 배포가 가능하다. 두번째 작업또한 100%이므로 배포가 가능하다. 따라서 당일에는 두 개의 작업이 배포된다.
9일뒤 세번째 작업이 100%가 되어 배포가 가능하다. 당일에는 한 개의 작업이 배포된다.
출력
answer = [2,1]
위와 같은 흐름의 프로그램을 만들어야한다,
이 문제가 큐/스택 카테고리에 속한 걸 먼저 보았기에 쉽게 접근 할 수있었다.
나는 문제를 보고 영상편집 프로그램 인코딩 시에 작업들이 큐에 저장되는 것이 연상되어 이 문제에서 큐 자료구조를 사용하기로 하였다.
순차적으로 완료된 작업들은 큐에서 삭제되는 아이디어이다.
from collections import deque
# 큐 자료구조를 사용하기위해 collcetions 라이브러리에서 deque 클래스를 불러왔다.
def solution(progresses, speeds):
answer = []
prog = deque(progresses) # 작업들의 진행도를 큐에 넣는다.
spd = deque(speeds) # 작업속도도 다른 큐에 넣는다.
while prog: # 작업들이 남아있다면
for i in range(len(prog)):
prog[i] += spd[i]
#작업의 현재 진행도에 작업 속도를 더해준다.
tmp = 0 # 당일 배포할 작업들 개수를 저장할 변수
try: # 인덱스 에러 발생시 예외처리
while prog[0] >= 100: # 첫번째 작업이 완료되었다면,
tmp += 1 # 배포할 작업 개수 1 추가
prog.popleft() # 완료된 첫번째 작업을 큐에서 없애기
spd.popleft() # 완료된 첫번째 작업의 작업속도도 큐에서 없애기
except: # poplfet로 인해서 prog에 남은 요소가 없으면 인덱스 에러가 발생한다.
pass
if tmp > 0: # 당일 배포할 작업이 있다면
answer.append(tmp) # answer 리스트에 당일 배포할 작업의 갯수를 append
return answer
문제 풀 당시에는 try execpt가 가장 깔끔하다 생각했는데
while prog[0] >= 100:
tmp += 1
prog.popleft()
spd.popleft()
if not prog: #<<<<< try except문 대신 사용
break
if tmp > 0:
answer.append(tmp)
그냥 if 문으로 prog가 비었는지 판단하며 더 간단하게 나타낼 수도 있었다.