[Python] 프로그래머스 LV2 기능개발

Yeolsim's logs·2024년 11월 24일
0

문제링크

문제 이해하기

여러 기능의 개발 진도와 속도가 주어졌을 때, 각 배포마다 몇 개의 기능이 배포되는지 계산하는 문제

  • input, output 확인

  • input

    • progresses(작업 진도)
    • speeds (작업 속도)
  • output

    • 각 배포마다 배포되는 기능의 개수를 담은 정수배열
  • 제약조건 확인

    • progresses(작업 진도) :100 미만의 자연수 (1~99)
    • speeds (작업 속도) :100 이하의 자연수 (1~100)
    • 배포는 하루에 한 번만 가능하며, 하루의 끝에 이루어짐

접근방법

  • 뒤에 있는 기능이 먼저 개발되더라도 앞 기능이 개발완료될때까지 기다렸다가 같이 배포해야함

  • 작업들을 배열 순서대로 처리해야 함

  • 자료구조와 알고리즘 활용

    • 첫번째 작업부터 순차적으로 작업 배열에서 직관적으로 제거하기 위해 큐 사용

코드설계

  1. 작업 진도와 속도를 튜플로 묶어 큐에 저장.
  2. 큐가 빌 때까지 다음 과정을 반복:
    a. 배포할 기능 수를 초기화.
    b. 첫 번째 작업이 완료되었는지 확인하고, 완료된 경우 큐에서 제거하며 배포 수를 증가.
    c. 남은 모든 작업의 진도를 증가.
    d. 배포한 기능이 있다면 결과 리스트에 추가.

코드구현

from collections import deque

def solution(progresses, speeds):
    answer = []
    q=deque(tuple(zip(progresses,speeds)))
    
    while q:
        #배포 초기화
        deploy=0

        #첫번째 작업이 완료되었다면 배포기능 갯수 증가 및 큐에서 제거
        while q and q[0][0]>=100:
            q.popleft()
            deploy+=1

        # 각 작업의 진도 증가
        q =deque([(p+s, s) for p, s in q])

        if deploy:
            answer.append(deploy)
            
    return answer

progresses=[93, 30, 55]
speeds=[1, 30, 5]
solution(progresses,speeds)

남은 작업시간과 작업속도의 차이를 통해 남은 수행시간을 구한 다음에 일괄적으로 계산하는 방법으로 구현

from collections import deque
import math

def solution(progresses, speeds):
    answer = []
    q=deque(tuple(zip(progresses,speeds)))

    while q:
        #배포 초기화
        deploy=0

        #첫번째 작업의 남은 작업진도 계산 ->정수로 올림처리(작업진도는 정수단위이므로)
        days_needed=math.ceil((100-q[0][0])/q[0][1])

        # 각 작업의 진도 업데이트 (100 초과하지 않도록)
        q =deque([(min(p+days_needed*s,100), s) for p, s in q])

        #첫번째 작업이 완료되었다면 배포한 기능갯수만큼 증가 및 큐에서 제거
        while q and q[0][0]>=100:
            q.popleft()
            deploy+=1

        if deploy: 
            answer.append(deploy)
            
    return answer

progresses=[93, 30, 55]
speeds=	[1, 30, 5]
print(solution(progresses,speeds))

0개의 댓글