[프로그래머스] 기능개발
프로그래머스 <기능개발>
https://programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
<기능개발>
작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 들어온다.
앞에 있는 기능보다 뒤에 있는 기능이 먼저 개발 완료될 수 있지만 배포는 progresses 배열의 순서를 따라야 한다.
즉, index 2의 작업이 index 1의 작업보다 빨리 끝났어도 배포는 index 1의 작업이 배포될 때 수행된다.
배포가 될 때마다 배포되는 기능의 수를 담은 배열 answer를 반환하면 된다.
문제 해결
이 문제는 progresses 배열의 첫 번째거부터 배포를 해야하기 때문에 큐를 이용해서 해결하였다.
먼저 progresses 배열과 speeds 배열을 각각 works와 doing이라는 이름의 queue를 만든다.
idx는 현재까지 몇 일이 지났는지를 의미하며 num은 배포되는 기능의 수를 의미한다.
works 큐에서 꺼낸 작업이 현재 완료되었는지 확인하고 -> check를 이용
완료되었다면 num에 +1을 한다.
완료되지 않았다면 num을 answer에 추가하고 1로 만든다. 이때 idx가 0일 때는 첫 번째 작업이므로 num을 추가하면 안된다.
남은 작업을 완료하기 위해 몇 일이 필요한지 계산하고 idx에 days를 더해준다.
works 큐가 빈다면 while문을 빠져나오므로 마지막 배포되는 기능의 수를 answer에 추가할 수 없다.
그렇기 때문에 while문을 빠져나와서 num을 answer에 추가해야한다.
코드
from collections import deque
def solution(progresses, speeds):
answer = []
works = deque(progresses)
doing = deque(speeds)
idx = 0
num = 0
while works:
popWork = 100 - works.popleft()
popDoing = doing.popleft()
check = popWork - idx * popDoing
if check > 0:
if idx != 0:
answer.append(num)
num = 1
days = check // popDoing
temp = check % popDoing
if temp != 0:
days += 1
idx += days
else:
num += 1
answer.append(num)
return answer
잘 짜놓고서 통과를 못해서 왜지 했는데
알고보니까 days와 temp를 구할 때 popWork를 그대로 썼다. check를 써야하는데!!
결과