문제
풀이 1 : 큐
제일 앞 인덱스를 계속 확인하면서 진행해야 하기에 자료구조 큐를 활용한다.
progresses 제일 앞 인덱스의 값을 확인하면서 100 이상이 되면 숫자를 세어주고, 아니면 progresses에 speeds값을 각 인덱스에 맞춰 한 번씩 더해준다.
제일 인덱스 0의 값을 계속 확인해야 하기에 자료구조 큐(deque)를 사용하여 제일 앞의 인덱스 값이 합하여 100이 되지 않을 시 다시 큐에 append 하도록 한다. 합이 100 이상이라면 배포가 가능하기에 숫자를 세어주고 작업개수(progresses, speeds)에서 빼내도록 한다.
코드 1 : 큐
from collections import deque
def solution(progresses, speeds):
answer = []
dp = deque(progresses)
ds = deque(speeds)
cnt = 0
while dp:
if dp[0] + ds[0] >= 100: # 100이상이 되어야 배포가 가능하기에
dp.popleft() # 배포 후에는 작업개수에서 빼도록 한다.
ds.popleft()
cnt += 1
else:
if cnt > 0:
answer.append(cnt)
else:
for _ in range(len(dp)): # 작업개수를 반복하면서 100이 되도록 계속 더하도록 한다.
p = dp.popleft()
s = ds.popleft()
p += s
dp.append(p)
ds.append(s)
cnt = 0 # cnt를 초기화
answer.append(cnt) # 제일 마지막 작업개수가 끝나면 반복문이 중단되고 그 수를 추가하는 것
return answer
if __name__ == '__main__':
pregresses = [93, 30, 55]
speeds = [1, 30, 5]
print(solution(pregresses, speeds))
풀이 2 : 스택(자료구조 리스트)
후입선출 방식인 스택 풀이는 아니지만, 스택은 자료구조 리스트를 활용하기에 인덱스를 활용하여 리스트로 풀 수 있다.
작업개수는 리스트로 주어지며 각 인덱스가 작업진도와 스피드가 한 셋트이기에 각 인덱스에 동일하게 speeds값을 몇 회 더해줄 것인지 확인하면서 진행하도록 한다.
몇 회 더해줄 것인지 확인하는 변수를 하나 생성하여 횟수를 거듭 올려주면서 100 이상이 될 때까지 확인한다.
pregresses가 100이상이라면 숫자를 세고 pregresses, speeds의 첫 번재 인덱스 값을 빼도록 한다. 100이 아니라면 100이 될 때까지 횟수를 올려주도록 한다.
코드 2 : 스택(자료구조 리스트)
def solution(progresses, speeds):
answer = []
time = 0 # 횟수
cnt = 0
while progresses:
if progresses[0] + time * speeds[0] >= 100:
progresses.pop(0)
speeds.pop(0)
cnt += 1
else:
time += 1 # 100이 될 때까지 계속 1씩 횟수를 올려준다.
if cnt > 0:
answer.append(cnt)
cnt = 0
answer.append(cnt)
return answer
if __name__ == '__main__':
pregresses = [93, 30, 55]
speeds = [1, 30, 5]
print(solution(pregresses, speeds))