문제
https://programmers.co.kr/learn/courses/30/lessons/42586?language=python3
사용 언어
Python3
풀이 과정
두 가지 방법으로 풀었다. 아래는 다른 사람 풀이를 보고 수정한 방식.
def solution(progresses, speeds):
answer = []
day = 0
count = 0
while len(progresses) > 0:
if(progresses[0] + day*speeds[0] >= 100):
progresses.pop(0)
speeds.pop(0)
count += 1
else:
if count > 0:
answer.append(count)
count = 0
day += 1
answer.append(count)
return answer
위 답안은 코드의 가독성이 좀 더 좋은 대신 메모리와 소요 시간이 약~간 더 비효율적이었다. 내가 생각나는대로 푼 방식은 for문을 두 번 사용했고 메모리와 소요 시간은 아래와 같다.
제출 답안
import math
def solution(progresses, speeds):
answer = []
days = []
for i in range(len(progresses)):
day = math.ceil((100 - progresses[i])/speeds[i])
days.append(day) # 5, 10, 1, 1, 20, 1
release = days[0] # 5
count = 1
for j in range(1, len(days)):
if days[j] <= release:
count += 1
else:
answer.append(count) # 1 3
release = days[j] # 10 20
count = 1
answer.append(count) # 2
return answer
다른 사람 답안
따로 공부한 내용보다 다른 사람 답안을 보고 배웠다.
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]
출처: 프로그래머스
zip() 메소드를 이용해서 기능의 작업률과 속도를 합쳐 계산이 쉽도록 했다.
-((p-100)//s) 부분은 필요한 작업일수를 구하는 계산식이다. 음수(-)로 몫을 구한 다음 다시 양수로 바꿔주었는데 math.ceil()을 적용한 것과 동일하다.
Q[i][0] 부분은 작업이 끝나기까지 필요한 일수이며, Q[i][1] 부분은 Q[i][0]일째에 배포 가능한 기능 수라고 보면 된다.
뒷 작업은 앞 작업이 끝나기까지 필요한 날짜와 비교해서 작으면 이미 앞작업에서 구했던 Q의 원소에서 기능수 부분에 +1 해주고 크면 list Q에 [필요한 일수, 기능수 = 1]의 형태로 새로 추가한다.
원소 개수 만큼 반복(for문)이 끝나면 배포 가능한 기능 수 부분만 잘라서 답을 리턴하는 코드이다.