문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds 배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
풀이 1
우선적으로, 해당 기능 개발에 남은 기간을 progresses, speeds라는 두 개의 리스트를 통해 계산 한 후,
queue에 담아서 첫번째 요소를 popleft()하고 count를 1 증가시킵니다.
이후 queue가 비어있지 않고, queue의 첫번째 값이 이전에 popleft()한 값보다 작거나 같다면, 마감일에 같이 나갈 수 있는 값이므로 반복적으로 확인하여 count를 1씩 증가시킨 후, 반복 조건에 충족하지 않는다면 answer 리스트에 담아줍니다.
import math
from collections import deque
def solution(progresses, speeds):
answer = []
remain = [math.ceil((100 - p) / s) for p, s in zip(progresses, speeds)]
queue = deque(remain)
while queue:
curr = queue.popleft()
count = 1
while queue and queue[0] <= curr:
queue.popleft()
count += 1
answer.append(count)
return answer
풀이 2
queue를 사용하지 않고, 동일한 구조를 갖지만, 반복문을 1번만 사용해서 문제 풀이도 가능합니다!
최초, 동일하게 현재 값을 remain의 첫번째 요소로 설정하고, count를 0으로 설정합니다.
물론, count를 1로 설정해도 되지만, 조건의 작성이 달라지니 참고하면 됩니다!
이후 remain을 순회하며 curr보다 작거나 같을 경우 curr의 마감일 내로 끝나는 작업이므로 count에 1씩 더하고,
그렇지 않다면, count를 answer 리스트에 담고 curr을 현재 값으로 설정 후 count를 1로 변경합니다!
-> 1로 변경하는 이유는 curr = i로 설정 이후, 반복문은 i의 다음 값부터 반복을 돌기 때문입니다!
import math
def solution(progresses, speeds):
answer = []
remain = [math.ceil((100 - p) / s) for p, s in zip(progresses, speeds)]
curr = remain[0]
count = 0
for i in remain:
if i <= curr:
count += 1
else:
answer.append(count)
curr = i
count = 1
answer.append(count)
return answer
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2. 가장 큰 수 (0) | 2024.10.17 |
---|---|
[프로그래머스] Lv1. 예산 (0) | 2024.10.17 |
[프로그래머스] 큰 수 만들기 (0) | 2024.10.01 |
[프로그래머스] 가장 큰 수 (0) | 2024.10.01 |
[프로그래머스] 체육복 (0) | 2024.10.01 |