Q. 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
입출력 예
progresses / speeds / return
[93, 30, 55] | [1, 30, 5] | [2, 1] |
[95, 90, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
def solution(progresses, speeds):
n = len(progresses)
day = [0]*n
for i in range(n):
day[i] = (100 - progresses[i]) // speeds[i]
if (100 - progresses[i]) % speeds[i] !=0:
day[i] += 1
stack = []
answer = []
stack.append(day.pop(0))
while day:
current = day.pop(0)
if stack[0] >= current:
stack.append(current)
else:
answer.append(len(stack))
stack = [current]
if not day:
answer.append(len(stack))
return answer
한 progress가 완성될 때 까지 걸리는 시간을 (100 - progress) // speeds로 계산하여 day 리스트에 추가한다. 만약 일수를 계산했을 때 나머지가 나온다면 하루를 더 연장시켜야하기 때문에 +1을 계산해준다.
예를 들어, 1번 테스트 케이스라고 가정해보자.
progresses = [93, 30, 55]
speeds = [1, 30, 5]
day = [7, 2, 9]
스택에 가장 day[0]을 추가한다.
그리고 그 다음 날 current = day[1]과 day[0]을 비교해서 day[1]이 작다면 배포를 기다려야 하기 때문에 stack에 추가.
아니라면 둘이 같이 배포할 수 있기 때문에 len(stack)를 정답에 넣어주고, 스택에 다음날과 비교해야할 current = day[1] 값을 넣어준다.
만약 day가 비어있다면 바로 스택의 길이만 출력!
스택/큐 문제는 아직도 익숙하지 않아 다른 사람의 풀이를 참고해서(거의 배꼈다) 공부했다. 이제 약간 어떤식으로 스택을 사용해야할지 알듯말듯... 우선 스택에 들어가있는 요소들과 비교할 변수가 추가로 더 필요하다는 것!
리스트에 append, remove 하는 것도 결국 스택인데 저건 쉽고 스택은 어려운게 참..,,
'Algorithm' 카테고리의 다른 글
programmers #소수찾기 (0) | 2021.08.10 |
---|---|
programmers #다리를 지나는 트럭 (0) | 2021.08.08 |
programmers #시저암호 (0) | 2021.08.07 |
programmers #체육복(정답아님) (0) | 2021.08.07 |
programmers #예산 (0) | 2021.08.07 |