프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42586
[나의 풀이]
⌛ 24분
from collections import deque
def solution(progresses, speeds):
answer = []
progresses = deque(progresses)
speeds = deque(speeds)
while progresses:
for i in range(len(progresses)):
progresses[i] += speeds[i]
first_prg = progresses[0]
deploy = 0
if first_prg>=100:
for prg in progresses:
if prg>=100:
deploy += 1
else:
break
answer.append(deploy)
for i in range(deploy):
progresses.popleft()
speeds.popleft()
return answer
개발해야하는 기능의 갯수(progresses)와 기능별 개발 속도(speeds)가 주어지고 맨 기능이 100% 개발이 되었을 때마다 그 뒤 100% 개발 완료된 기능들을 한번에 배포한다고 했을때 배포별 개발 완료 기능 갯수를 구하는 문제입니다.🐾🐾🐾
앞에서부터 순차적으로 확인해야하므로 Queue구조를 활용하였고 개발 속도(speeds)를 순서대로 더한 뒤 완료된 기능이 있을 때, 해당하는 기능,속도를 popleft()하는 방식으로 구현하였습니다.
[다른 사람의 풀이1]
def solution(progresses, speeds):
Q=[]
for p, s in zip(progresses, speeds):
if len(Q)==0 or Q[-1][0]<-((p-100)//s):
Q.append([-((p-100)//s),1])
else:
Q[-1][1]+=1
return [q[1] for q in Q]
개발해야하는 기능(progresses), 개발 속도(speeds) 두 리스트를 zip()으로 결합한 뒤 한번에 for문을 돌리면서 현재 기능과 이전 기능 개발의 소요 기간을 비교하여
만약 동일한 기간 내에 완료된다면 기존 [소요 기간, 소요기간 내 개발 기능 갯수]의 1번 인덱스에 += 1 하고 더 오래걸린다면 새로 [소요 기간, 소요기간 내 개발 기능 갯수]을 append하는 방식입니다.🕊️🕊️🕊️
for문 1번으로 해결할 수 있는 가장 간결한 풀이였습니다.
[다른 사람의 풀이2]
import math
def solution(progresses, speeds):
progresses = [math.ceil((100 - a) / b) for a, b in zip(progresses, speeds)]
answer = []
front = 0, 0
for idx in range(len(progresses)):
if progresses[idx] > progresses[front]:
answer.append(idx - front)
front = idx
answer.append(len(progresses) - front)
return answer
'다른 사람의 풀이1'과 유사한 구조이되 완료된 가장 앞의 기능을 front라는 포인터를 기억하여 활용하는 방식입니다.
front가 가리키는 기능과 현재 기능의 소요기간을 비교한 뒤 이미 완료된 기능보다 소요기간이 더 필요하다면 완료된 기능까지의 갯수를 answer에 추가하고 front를 현재기능으로 초기화하여 다시 비교하는 풀이입니다.🐇🐇🐇
'다른 사람의 풀이1'보다 훨씬 가독성 좋은 형태로, 더 쉽게 이해할 수 있었습니다.
감사합니다.