(프로그래머스 with python) 기능개발
기능개발 (Level2)
작업진도(progresses)가 100이 되기 전까지 작업속도(speeds)만큼 증가된다. 리스트에 담긴 값들로 무언가를 해야할때 항상 먼저 생각드는 중첩 for문..^^ 하지만 여기서는 for문과 while문을 사용해야겠다는 생각을 했다. 왜그런가하니 progresses가 각각 진행이 되어야 하는데 하나의 progress가 진행될때 100이 되지 않으면 100이 될 때까지 작업속도를 더해주어야 했기 때문에 for문 안에 while문을 써서 각 리스트에 담긴 progress들을 100으로 만들어 줄 생각이었다.
def solution(progresses, speeds):
result_list = []
j = 0
for i in progresses[:]:
cnt = 0
while True:
if i >= 100:
result_list.append(cnt)
progresses.pop(0)
break
i += speeds[j]
cnt += 1
j+= 1
answer = [1 for _ in range(len(speeds))]
for i in range(1, len(result_list)):
if result_list[i-1] >= result_list[i]:
answer[i-1] += 1
answer[i] -= 1
remove_set = {0}
answer = [i for i in answer if i not in remove_set]
return answer
위의 코드가 초반에 작성한 로직인데 테스트케이스가 고작 2개 밖에 통과하지 못한다.. 그 이유는 코드를 좀만 살펴봐도 알 수 있었다. 아래의 로직에서 보면 1번의 작업(result_list[i-1])이 그 뒤에 있는 작업보다 더 오래 걸렸을때 바로 뒤에 있는 작업과는 비교가 되지만 이후의 작업과는 비교할 수 없기 때문에 90, 99, 99의 경우처럼 연속으로 작업이 끝난 상황을 체크할 수 없다.
for i in range(1, len(result_list)):
if result_list[i-1] >= result_list[i]:
answer[i-1] += 1
answer[i] -= 1
이 문제를 풀때는 모든 작업들이 speeds의 값만큼 동시에 계속해서 더해지는 쪽으로 생각하면 좀 더 효율적으로 풀 수 있다. 아래의 로직처럼 while문 안에 각각의 작업들을 반복하면서 동시에 speeds의 값만큼 더해준다. 이후 첫번째의 작업이 100보다 같거나 큰 경우에는 완료된 작업수인 의미로 cnt를 누적으로 더해준다. 이렇게 동시에 더해주고 앞의 작업값부터 하나씩 체크를 해나가면 위에서 해결하지 못한 부분을 해결할 수 있다. 90, 99, 99처럼 speeds의 값이 1이라고 가정하면 90이 10번 진행이되고 99는 1번만 진행된다. 동시에 진행을 시키면 100, 109, 109로 증가가되는데 100이 넘어가면 무조건 앞의 작업과 함께 배포가 된다고 생각하면 되기 때문에 While문에 3개의 작업이 모두 걸려서 cnt의 값이 그만큼 증가되게 된다!
def solution(progresses, speeds):
answer = []
while progresses:
cnt = 0
for i in range(len(progresses)):
progresses[i] = progresses[i] + speeds[i] # 동시에 계속 더해진다.
while progresses[0] >= 100: # 첫번째 인덱스값이 0인 경우에 / 이미 동시에 시작했기 때문에 100이 이미 된 요소들이 cnt +=1 을 연속으로 진행
progresses.pop(0) # pop 해준다
speeds.pop(0)
cnt += 1 # 완료된 작업수
if not progresses: # 만약 progresses가 없다면 break
break
if cnt > 0:
answer.append(cnt)
return answer