[프로그래머스] 스택/큐 > 기능개발

문제

배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하세요.

조건

  • 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
  • 진도가 100%여도 순서가 더 빠른 기능과 같이 배포할 수 있습니다.
  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

방법

  • 작업 순서대로 진행합니다.
  • 기능의 배포 날짜를 기록합니다.
  • 먼저 배포되는 기능의 배포 날짜보다 빠르다면 앞의 날짜에 배포되는 기능의 수를 1 증가시킵니다.

문제풀이

from collections import defaultdict


def solution(progresses, speeds):
    scheduler = defaultdict(int)
    next_deploy = 0

    for p, s in zip(progresses, speeds):
        q, r = divmod(100 - p, s)
        when_deploy = q if r == 0 else q + 1

        if next_deploy <= when_deploy:
            next_deploy = when_deploy

        scheduler[next_deploy] += 1

    return list(scheduler.values())

zip 함수를 이용하여 코드를 좀 더 간결하게 작성하였습니다.
defaultdict를 사용하여서 배포 날짜가 scheduler에 등록돼있는 날짜인지 검증하는 로직을 제거하였습니다.

테스트 코드

import unittest
from solution import solution


class TestCase(unittest.TestCase):
    def test_solution(self):
        self.assertEqual(solution([99, 40, 30], [1, 20, 55]), [1, 2])


if __name__ == '__main__':
    unittest.main()

어려웠던 점

  • 우선 순위 큐를 적용하여 해결했더니 쉽게 해결할 수 있었다.

Written by@EHX
Software Developer, Back-End Engineer

GitHubFacebook