기능개발

김민석·2021년 3월 4일
0

오답노트 Lv.2

목록 보기
4/8

나의 풀이

나의 풀이는 stack의 기본?에 충실한 풀이라고 감히 '자평' 한다.

from collections import deque

def solution(progresses, speeds):
    answer = []  
    
    progresses = deque(progresses)
    speeds = deque(speeds)
    
    while progresses:
        
        cnt = 0 
        
        while progresses and progresses[0] >= 100:
            progresses.popleft()
            speeds.popleft()
            cnt += 1
    
        progresses = deque([progress+speed for progress,speed in zip(progresses,speeds)])

        if cnt :
            answer.append(cnt)
    
    return answer

하지만 단점은 가장 빠른 풀이가 아니라는 점.
비효율적인 부분이 두 가지가 있다.

  • 이미 진행도가 100% 이상인 요소에도 계속 연산이 되는 점.

계속 각자의 진행도만큼 더해주다가, 맨 왼쪽 요소가 진행도 100이 되면, 안의 것들을 모조리 빼는 것으로 요약 할 수 있겠다.


코드스테이츠에서 배운 풀이

아래 코드의 절차는 다음과 같다.

  • 각 speed와 100-progress를 이용해서 일이 필요한 일수를 계산 후, workday에 저장.

이 아래가 묘미다.

  • workday 안에서 만약 0번째 요소보다 큰 값이 존재한다면

    ex)
    1) workday = [5,2,3,6,2,4]에서,
    2) 5보다 큰 6(index = 3)이 존재하기 때문에
    3) index를 answer에 append한 후,
    4) 해당 index까지 workday = workday[3:]로 workday를 잘라준다.
    5) 그러면 [6,2,4]가 나온다.
    6) 이 경우에는 아래 코드에서 decision이 빈 배열로 나오기 때문에, 이때는 남은 workday의 len을 append 해주면 된다.

def solution(progresses, speeds):
    workday = [(100-progress)//speed+1  if (100-progress)%speed != 0 else (100-progress)//speed
               for progress, speed in zip(progresses,speeds)]
    answer = []

    while workday:
        decision = [i for i in workday if i>workday[0]]
        if decision:
            index = workday.index(decision[0])               
            answer.append(index)
            workday = workday[index:]
        else :
            answer.append(len(workday))
            break
            
    return answer  

0개의 댓글