# progresses = [93, 30, 55], speeds = [1, 30, 5] -> [2, 1]
# 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일 후 배포
# 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일 후 배포 가능. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 같이 배포됨
# 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일 후 배포
# => 7일째에 2개의 기능, 9일째에 1개의 기능이 배포
## 의사코드 ##
# 후입선출 -> 스택
# 각 기능마다 배포까지 남은 일수 계산
# if 스택 == []:
# 스택.append(남은 일수)
# else:
# if 스택[-1] > 남은 일수:
# 스택.append(스택[-1])
# else:
# 스택.append(남은 일수)
통과한 코드
import math
from collections import Counter
def solution(progresses, speeds):
# 각 기능마다 배포까지 남은 일수 계산
remain = []
for i in range(len(progresses)):
r = math.ceil((100 - progresses[i]) / speeds[i]) # math.ceil() -> 올림
remain.append(r)
# 각 기능마다 배포될 날짜를 스택에 삽입
stack = []
for r in remain:
if stack == []: # 스택이 비어있으면
stack.append(r)
else: # 스택이 비어있지 않으면
if stack[-1] > r: # 자신 직전 기능의 배포일이 자신의 배포일보다 크면
stack.append(stack[-1]) # 자신 직전 기능의 배포일을 삽입
else:
stack.append(r)
answer = list(Counter(stack).values())
return answer
-> 스택이라기보다는 그냥 리스트를 이용해서 풀었다
다른 풀이
큐를 이용한 풀이
def solution(progresses, speeds):
# 결과를 담을 리스트
answer = []
# 작업 리스트가 빌 때까지 반복
while progresses :
# 몇 개의 기능이 배포되는지 저장
cnt = 0
# 작업 리스트가 남아있고 맨 앞의 작업의 진도가 100인 경우
while progresses and progresses[0] >= 100:
cnt+=1 # 기능 배포 변수 증가
# 해당 작업과 작업 속도를 리스트에서 제거
progresses.pop(0)
speeds.pop(0)
# 작업 리스트의 진도를 증가
progresses = [progresses[i]+speeds[i] for i in range(len(progresses))]
# 만약 오늘 기능이 배포되었다면 결과 리스트에 추가
if cnt:
answer.append(cnt)
return answer