티스토리 뷰

728x90

[Python]프로그래머스 문제풀이 - 기능개발




서문


오늘은 프로그래머스 사이트 / 코딩테스트 / 스택,큐부분 두 번째 문제풀이를 하겠습니다. 문제를 살펴보겠습니다. 😉




코드의 전개 논리가 궁금하시다면, 밑의 사이트에 들어가서 코드를 작성하여 visualize해주시면 코드가 어떤 식으로 흘러가는지 눈으로 파악하실 수 있습니다!



출처: http://pythontutor.com/




1. 문제 설명


프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

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



2. 제한사항


  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]


3. 입출력 예 설명


1#


  • 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.

  • 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.

  • 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다. 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

2#


  • 모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.

  • 따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.





본문


요약


  • progresses와 speeds가 배열로 주어진다.

  • 하루에 각 각 progress에 speed가 더해진다.

  • progresses가 100%가 될 때, 해당된 progress를 배포하고, 그 개수를 return 한다. 이때 동일한 날에 2개의 기능이 배포된다면 2를 return 한다. 또한 어떤 기능이 100%가 되었더라도 앞에 있는 기능이 완료되지 않으면 배포되지 않는다.


문제풀이



코드


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

    while progresses:

        for i in range(len(progresses)):
            progresses[i] += speeds[i]


        count = 0

        while progresses and progresses[0] >= 100:
            progresses.pop(0)
            speeds.pop(0)
            count += 1

        if count:
            answer.append(count)

    return answer


Detail Code Review


  • 우선 progresses와 speeds가 100이하의 길이를 가지는 것을 보면 코드의 효율면에서는 살짝 여유가 있을 수 있습니다.

  • 이 문제에서 중요한 점은 앞에 있는 기능이 배포되지 못하면 뒷 기능이 100%를 달성하더라도 배포할 수 없는 점입니다.

  • 간단하게 논리를 설명하면, while 문에 progresses를 넣어준 것은 100%가 된 progresses를 배열에서 빼줄 것이고, 만약 progresses의 배열이 비면 while문은 멈추게 됩니다.

  • progresses와 speeds를 더합니다. 그 다음 progresses[0] 요소가 100보다 크거나 같은지 판단합니다. 이 때 while문에도 progresses가 비었는지 우선 확인하고 그 다음 요소가 있다면 100보다 크거나 같은지 확인합니다. 왜냐하면 마지막에 [114,119] 값이 남는데, 나머지 값이 없어졌을 때 while progresses: 를 확인하는 부분이 없다면 index error가 발생하기 때문입니다.

  • 만약 progresses[0]요소가 100을 넘었다면 progresses 배열에서 0번 index 즉 100이 넘었던 값을 pop 시켜줍니다. 동시에 speeds[0] 값도 빼줍니다. 그럼 count += 1이 됩니다.

  • 그럼 다시 그 다음 요소를 판단하는 while문을 타게 됩니다. 만약에 그 다음 수가 100을 넘지 않았다면, if count: 조건문으로 빠지게 되고 answer에 담기게 됩니다.




혹시 문제가 있는 부분이 있으시면 말씀해주세요.🙄




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함