https://programmers.co.kr/learn/courses/30/lessons/42586
프로그래머스에서 놀랍게도 72개의 레벨1 문제 중 11개만 남겨두고 있다....
푼 개수가 무슨 의미가 있나 싶지만 그래도 약 85%를 푼 기념으로 레벨2를 풀어봤는데 난이도가 급 어려워져서 꽤 오래 붙잡고 있었다...
speeds가 주어질 때 마다 각 배포 시 몇개의 기능이 배포될 수 있는지 구하는 문제이다.
이전 기능이 배포가 되지 않으면 뒤에 있는 기능들이 progresses가 100이 되어도 배포할 수 없다.
처음엔 for문을 사용해서 해결해보려고 progresses와 speeds를 zip으로 묶어서 for문을 실행했지만 speeds에 곱해져야 할 day라는 변수를 처리할 수 없어서 실패했다.
좋은 방법을 떠올리지 못해서 다른 사람들의 풀이를 이곳 저곳 찾아봤고 공통적으로 zip을 이용해 for문을 사용한 풀이이거나 while문을 사용한 풀이 이 2가지로 모두 해결했다.
나는 zip을 이용한 for문을 제대로 이해하지 못해서 while문을 사용한 풀이로 해결했다.
정답 코드
def solution(progresses, speeds):
answer = []
day = 1
cnt = 0
while len(progresses) > 0 :
if progresses[0] + speeds[0]*day >= 100 :
progresses.pop(0)
speeds.pop(0)
cnt += 1
else :
day += 1
if cnt > 0 :
answer.append(cnt)
cnt = 0
answer.append(cnt)
return answer
처음에 이 풀이를 봤을 때 바로 이해하기 힘들었는데 한줄 한줄 프린트 찍어보니 이해가 되었다.
if문이 실행되는지 else로 들어가는지 구별하기 위해 p,s,d 앞에 if 또는 el을 붙였다.
day가 잘 증가하는지도 확인하기 위해서 d로 출력되도록 했다.
if문은 day에 speeds를 곱한 값과 progresses를 더한 값이 100 이상이 되면 실행이 되고 0번째 원소를 pop을 사용하여 제거한다. 이후 100 이상이기 때문에 배포할 수 있으므로 cnt에도 1을 더해준다.
하지만 day에 speeds를 곱한 값과 progresses를 더한 값이 100보다 작은 값이라면 day에 1을 더한다. 이 더한 day값이 while문의 반복에 의해 if문에 들어오게 되는 것이다. 그렇게 day가 7일 때 day에 speeds를 곱한 값과 progresses를 더한 값이 100 이상이 되어서 if 문이 실행되었고 0번째 원소인 93과 1이 삭제되었다.
이 때 0번째 원소는 이제 각각 30, 30이 된다. 이때 이미 day에 speeds를 곱한 값과 progresses를 더한 값이 100이 이상이기 때문에 day가 증가하지 않고 바로 0번재 원소가 pop에 의해 제거된다.
이제 0번째 원소는 각각 55와 5가 되었고 다시 day에 speeds를 곱한 값과 progresses를 더한 값이 100 이상이 될 때까지 day가 증가한다. 만약 cnt가 위의 if 문에 의해 0보다 크다면 answer에 append를 사용하여 삽입해준 후 다시 cnt를 0으로 초기화한다. 위에서 두번이나 100 이상이 되었기 때문에 이미 cnt는 0보다 큰 상태이므로 2가 answr에 삽인된다.
day가 9일 때 day에 speeds를 곱한 값과 progresses를 더한 값이 100 이상이 되어서 pop으로 원소들이 삭제되고 else가 실행되지 않고 if문에 의해 증가된 cnt 값을 apppend를 사용해 answer에 넣어준다.