<로직 고민/>
- 음 일단 progresses의 각 원소가 100보다 같거나 커지면 배포할 수 있군
- 첫 번째 작업이 끝났을 때 뒤에 작업이 첫 번째 작업일수보다 작으면 같이 배포되고, 크면 다음 기회에,,,
- for문은 progresses의 길이만큼 돌려야겠군(speeds 길이만큼 해도 상관없고)
- period라는 빈 리스트를 선언해서 각 작업별 작업기간을 넣어줘야겠다
- 작업 기간은 (100 - progresses) % speeds 했을 때 0이 나오면 그 몫이 기간이 되고, 0이 아니면 그 몫에 +1을 해주면 된다
- for문이 다 돌면 period의 첫 번째 인덱스 값을 distribution이라는 변수에 넣어주고, count 변수를 0으로 초기화한 후 period 리스트를 for문에 돌린다
- 각 원소가 distriution보다 작거나 같으면 count에 1을 더하고, 크면 answer에 count를 담고 count는 1로 초기화한다(현재 돌고 있는 period 원소가 distribution이 될 것이기 때문!
- for문이 다 돌면 마지막 배포날의 기능 개수가 담긴 count를 answer에 담는다
- 다소......복잡한데.......풀리긴 한다...
<완성된 풀이/>
- 첫 번째 풀이
def solution(progresses, speeds):
answer, period = [], []
for i in range(len(speeds)):
if (100 - progresses[i]) % speeds[i] == 0:
period.append((100 - progresses[i]) // speeds[i])
else:
period.append(((100 - progresses[i]) // speeds[i]) + 1)
distribution = period[0]
count = 0
for day in period:
if distribution >= day:
count += 1
else:
answer.append(count)
count = 1
distribution = day
answer.append(count)
return answer
- 첫 번째 for문을 보니 리스트 컴프리헨션을 쓰고 싶어졌다
- 두 번째 풀이(리스트 컴프리헨션 활용)
def solution(progresses, speeds):
period = [
(100 - progresses[i]) // speeds[i]
if (100 - progresses[i]) % speeds[i] == 0
else ((100 - progresses[i]) // speeds[i]) + 1
for i in range(len(speeds))
]
distribution = period[0]
count, answer = 0, []
for day in period:
if distribution >= day:
count += 1
else:
answer.append(count)
count = 1
distribution = day
answer.append(count)
return answer
- 막상 써보니 보기에 별로 안 좋다 첫 번째 풀이가 더 나은 듯
- 세 번째 풀이(람다식 활용)
def solution(progresses, speeds):
period = list(
map(
lambda p, s: (100 - p) // s if (100 - p) % s == 0 else ((100 - p) // s) + 1,
progresses,
speeds,
)
)
distribution = period[0]
count, answer = 0, []
for day in period:
if distribution >= day:
count += 1
else:
answer.append(count)
count = 1
distribution = day
answer.append(count)
return answer
- 람다식 쓰면 더 간결하게 보일 것 같아서 도전해봤다
- 리스트 컴프리헨션보다는 나은 듯
- 네 번째 풀이(ceil 함수 활용)
def solution(progresses, speeds):
from math import ceil
period = [(ceil((100 - p) / s)) for p, s in zip(progresses, speeds)]
distribution = period[0]
count, answer = 0, []
for day in period:
if distribution >= day:
count += 1
else:
answer.append(count)
count = 1
distribution = day
answer.append(count)
return answer
- 더 간결하게 할 수 없을까 하고 찾아봤는데 올림 연산을 해주는 ceil 함수라는 게 있길래 적용해봤다
- 그리고 range(len(speeds) 대신 zip() 함수를 활용해봤다 ㅎㅎㅎ!
- zip 요즘 많이 쓰는 듯..!
- 첫 번째 풀이법이 지저분해 보여서 다른 방법을 찾아본 거였는데 리스트 컴프리헨션이나 람다식은 함수 실행 시간이 더 걸리는 것 같다(그래봐야 얼마 차이 안 나긴 하지만)
- 네 번째 풀이가 간결하고 좋은데 ceil 함수를 import 해야 하는 게 마음에 안 든다 ㅋㅋㅎㅎㅋㅋ
- 그래도 중복 코드를 줄였으니 네 번째 코드가 제일 좋은 코드라고 할 수 있지 않을까?!
<다른 사람 풀이/>
- 천재풀이1
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]
- 이 코드를 다 이해하지는 못 했는데 -((p-100)//s 부분이 ceil 함수를 쓰지 않기 위한 부분이라고 해서 가져와봤다
- 누군가 댓글로 이렇게 설명해줬다
- 굉장히...무슨 말인지........! 잘 .......모르겠.........다.................