[프로그래머스 / lv.2] 기능개발
in Problem Solving on Programers
날짜: 2021년 11월 3일
소요 시간: 29분 21초
카테고리: 스택/큐
태그: 레벨2, 파이썬
입출력 예시
| progresses | speeds | return |
|---|---|---|
| [93, 30, 55] | [1, 30, 5] | [2, 1] |
| [95, 90, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
내가 적은 코드
import copy
from collections import deque
def solution(progresses, speeds):
answer = []
progresses = deque(progresses)
speeds = deque(speeds)
while progresses:
cnt = 0
for idx in range(len(progresses)):
progresses[idx] = progresses[idx] + speeds[idx]
for work in copy.deepcopy(progresses):
if progresses.index(work) == 0 and work >= 100:
progresses.popleft()
speeds.popleft()
cnt += 1
if cnt != 0:
answer.append(cnt)
return answer
풀이 과정
하루하루 업무를 진행하여 만약 progresses의 원소 중 인덱스가 0인 process가 100을 넘긴다면 일이 마무리 되었다는 이야기므로
progresses와 speeds의 왼쪽 원소를 popleft()하고 cnt에 1을 추가
만약 그 다음 업무 역시 100을 넘긴다면 그 업무 또한 마무리 되었다는 의미이므로 progresses와 speeds의 왼쪽 원소를 popleft()를 반복하고 cnt에 1을 플러스
그렇게 한 싸이클이 끝난다면 그날 배포한 업무의 갯수인 cnt를 배열 answer에 appned()
모든 반복이 끝난다면 progresses의 원소가 비었을 것이므로 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()을 활용해서 코드 간결성을 높였다. 나도zip()의 이해도를 높여서 코드에 활용할 줄 알아야한다.- 사실 나의 코드는 업무 진행 정도가 100을 넘겨도 계속 연산하기 때문에 쓸떼없이 연산량이 많다. 알면서도 냅둔건 일단 돌아가게 만들었다는 의미이므로 사실 좋은 코드라고는 할 수 없다.
- 베스트 코드에서는 남은 업무량에서 속도를 나누어서 업무를 마무리하기 위해 남은 일수를 계산하여 보다 효율적으로 계산했다고 할 수 있다.
- 이런건 사실 센스적인 문제라서 내가 좀 더 효율적인 코드에 대해 고민을 많이 해 보는 습관을 들여야겠다.
