https://programmers.co.kr/learn/courses/30/lessons/42586
import math
def solution(progresses, speeds):
answer = []
day = [math.ceil((100 - p) / s) for p,s in zip(progresses, speeds)] # 각 작업 시간이 저장된 리스트
pop = 0 # 배포할 순서 값 (배포해야 할 첫번째 값)
# 몇 개의 기능이 배포되는지 계산
for i in range(len(day)):
if day[pop] < day[i]:
answer.append(i - pop)
pop = i
answer.append(len(day) - pop) # 마지막 배포 기능 수 추가
return answer
처음에는 반복문을 돌면서 작업이 100%가 되면 다른 리스트에 저장해두고 각 배포시 기능 개수를 세면 되겠다고 생각해서 그렇게 코드를 짰습니다. 다른 리스트에 저장까진 할 수 있는데 배포마다 기능개수를 어떻게 세야할지 도저히 생각이 나지 않아 다른 방법을 생각해보았습니다. 그렇게 생각한 방법으로 짠 코드가 위의 코드입니다.
각 작업마다 작업시간을 계산해서 배포해야할 첫번째 값을 기준으로 그 값보다 크면 다음 배포로 넘어가고 그렇지 않으면 그 첫번째값과 같이 배포하면 된다고 생각했습니다. 그래서 각 작업마다 작업시간을 계산해서 day에 리스트로 저장했습니다. 배포해야할 순서인 값은 pop에 저장했고 그것을 기준으로 삼아 비교했습니다. for문을 통해 day를 돌면서 day[pop]보다 큰 값이 나오면 그 값은 다음 배포의 첫번째 값이 되므로 i - pop 하여 해당 배포의 기능 개수를 계산하여 answer에 추가하였습니다. 다음 배포로 넘어가기 위해 pop = i를 해주었습니다.
다음과 같이 마지막 배포의 기능 수를 answer에 추가해주지 않았더니 테스트를 통과하지 못해서 그 코드를 넣었더니 통과가 됐습니다.
다른 사람의 풀이를 보니 제가 처음 생각한 것과 비슷하게 짠 코드가 있었습니다. 이런 생각을 할 수 있다니 놀라웠습니다.
def solution(progresses, speeds):
answer = []
time = 0
count = 0
while len(progresses)> 0:
if (progresses[0] + time*speeds[0]) >= 100:
progresses.pop(0)
speeds.pop(0)
count += 1
else:
if count > 0:
answer.append(count)
count = 0
time += 1
answer.append(count)
return answer
이 링크는 큐를 사용하는 방법에 대한 내용입니다. 큐를 사용하는 방법에 여러가지가 있으니 참고하면 좋을 것 같습니다.
https://www.daleseo.com/python-queue/
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] 주식가격 - Level2 (0) | 2021.05.24 |
---|---|
[프로그래머스/Python] 프린터 - Level2 (0) | 2021.05.22 |
[프로그래머스/Python] 다트게임 (0) | 2021.05.19 |
[프로그래머스/Python] 비밀지도 (0) | 2021.05.18 |
[프로그래머스/Python] 카펫 - Level2 (0) | 2021.05.18 |