- 문제 링크: programmers.co.kr/learn/courses/30/lessons/42586

모든 기능이 병렬적으로 각자의 속도에 맞춰 개발되는데, 맨 앞에서부터 배포될 수 있고, 한번에 앞에서부터 여러개씩 배포가 가능하다고 합니다.

이때 각 배포마다 몇개의 기능이 배포되는지를 알고 싶다고 합니다.

 

적당히 ceil을 써서 각 기능마다 며칠이 있어야 100퍼센트 이상이 되는지 확인하고, 그 날짜만큼 모든 job들의 작업 진도를 각 속도를 곱해 더해주면 됩니다.

풀이 보니까 pop(0)을 쓴 분도 있던데, 파이썬에서 list는 C++ std::vector처럼 동적 배열이기 때문에 앞에서 빼는 짓을 할 때마다 O(n)의 시간복잡도를 가지니 그냥 인덱스로 관리해주는게 좋습니다

그리고 실수 연산은 오차가 생길 수 있으니 ceil 함수 사용보다는 나머지 0 계산을 한다든지 하는 정수 연산을 하는게 더 정확합니다

 

def solution(progresses, speeds):
    answer = []
    num_of_jobs = len(progresses)

    idx = 0
    while idx < num_of_jobs:
        required_day = ((100-progresses[idx]) // speeds[idx]) + ((100-progresses[idx]) % speeds[idx] != 0)
        for i in range(idx, num_of_jobs):
            progresses[i] += required_day * speeds[i]

        counter = 1
        for i in range(idx+1, num_of_jobs):
            if progresses[i] < 100:
                break
            counter += 1

        answer.append(counter)
        idx += counter

    return answer

대충 짜보면 위와 같습니다

반응형