while progresses:로 묶고
for 문을 돌려 progress[i] += speed[i]를 해준 뒤
progresses[0]이 100 이상이라면 progresses[0]을 포함해 그 뒤에 것들까지 요소의 값이 100 이상인 것을 찾고 해당 요소를 pop()하는 식으로 문제를 풀었다.
def solution(progresses, speeds):
answer = []
while progresses:
for i in range(len(progresses)):
progresses[i] += speeds[i]
if progresses[0] > 99:
res = 0
while progresses and progresses[0] > 99:
res += 1
progresses.pop(0)
speeds.pop(0)
answer.append(res)
return answer
하지만 저렇게 할 필요 없이 해당 progress가 완료될 때까지 며칠이 남았는지 구하고 그 일수가 앞에 있는 progress보다 작으면 앞의 count에 +1 하고 그게 아니면 새로 append() 하는 식으로 하면 더 짧고 빠르게 문제를 해결할 수 있다. 코드 로보면 아래와 같다.
def solution(progresses, speeds):
Q = []
for p, s in zip(progresses, speeds):
if len(Q) == 0 or Q[-1][0] < -((p - 100)//s):
Q.append([-((p - 100)//s), 1])
else:
Q[-1][1] += 1
return [q[1] for q in Q]
여기서 5, 6번째 줄에 ((100 - p) // s)를 하지 않고 -((p - 100) // s)를 하는 이유는
((100 - p) // s)의 경우 (100 - p) ÷ s가 자연수가 아니면 math.ceil() 함수를 사용해 올림을 해야 하지만
음수의 경우 파이썬의 특징 때문에 math.ceil() 함수를 쓰지 않고도 원하는 값을 구할 수 있기 때문이다.
'알고리즘, 자료구조' 카테고리의 다른 글
완주하지 못한 선수 (0) | 2022.07.04 |
---|---|
ArrayList,LinkedList 비교 (0) | 2022.07.01 |
124 나라의 숫자 (0) | 2022.06.25 |
멀쩡한 사각형( 파이썬 ) - 프로그래머스 (0) | 2022.06.24 |
DFS와 BFS - 파이썬 구현 (0) | 2022.06.20 |