Algorithm/프로그래머스

[프로그래머스/Python] 기능개발 - Level2

poppy 2021. 5. 21. 11:30
반응형

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

import math

def solution(progresses, speeds):
    answer = []
    day = [math.ceil((100 - p) / s) for p,s in zip(progresses, speeds)] # 각 작업 시간이 저장된 리스트
    pop = 0 # 배포할 순서 값 (배포해야 할 첫번째 값)
    
    # 몇 개의 기능이 배포되는지 계산
    for i in range(len(day)):
        if day[pop] < day[i]:
            answer.append(i - pop)
            pop = i
    
    answer.append(len(day) - pop) # 마지막 배포 기능 수 추가
        
    return answer

처음에는 반복문을 돌면서 작업이 100%가 되면 다른 리스트에 저장해두고 각 배포시 기능 개수를 세면 되겠다고 생각해서 그렇게 코드를 짰습니다. 다른 리스트에 저장까진 할 수 있는데 배포마다 기능개수를 어떻게 세야할지 도저히 생각이 나지 않아 다른 방법을 생각해보았습니다. 그렇게 생각한 방법으로 짠 코드가 위의 코드입니다.

 

각 작업마다 작업시간을 계산해서 배포해야할 첫번째 값을 기준으로 그 값보다 크면 다음 배포로 넘어가고 그렇지 않으면 그 첫번째값과 같이 배포하면 된다고 생각했습니다. 그래서 각 작업마다 작업시간을 계산해서 day에 리스트로 저장했습니다. 배포해야할 순서인 값은 pop에 저장했고 그것을 기준으로 삼아 비교했습니다. for문을 통해 day를 돌면서 day[pop]보다 큰 값이 나오면 그 값은 다음 배포의 첫번째 값이 되므로 i - pop 하여 해당 배포의 기능 개수를 계산하여 answer에 추가하였습니다. 다음 배포로 넘어가기 위해 pop = i를 해주었습니다.

 

다음과 같이 마지막 배포의 기능 수를 answer에 추가해주지 않았더니 테스트를 통과하지 못해서 그 코드를 넣었더니 통과가 됐습니다.

 

다른 사람의 풀이를 보니 제가 처음 생각한 것과 비슷하게 짠 코드가 있었습니다. 이런 생각을 할 수 있다니 놀라웠습니다.

def solution(progresses, speeds):
    answer = []
    time = 0
    count = 0
    
    while len(progresses)> 0:
        if (progresses[0] + time*speeds[0]) >= 100:
            progresses.pop(0)
            speeds.pop(0)
            count += 1
        else:
            if count > 0:
                answer.append(count)
                count = 0
            time += 1
            
    answer.append(count)
    return answer

 

이 링크는 큐를 사용하는 방법에 대한 내용입니다. 큐를 사용하는 방법에 여러가지가 있으니 참고하면 좋을 것 같습니다.

https://www.daleseo.com/python-queue/

 

파이썬에서 큐(queue) 자료 구조 사용하기

Engineering Blog by Dale Seo

www.daleseo.com

 

반응형