티스토리 뷰

프로그래머스 - 기능개발

문제 요약

  1. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있다.
  2. 각 기능의 개발 속도는 모두 다르다. 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발 될 수 있지만, 이 경우에 앞에 있는 기능이 배포될 때 함께 배포된다.
  3. 따라서 배포해야 하는 기능에는 순서가 있다.

문제 생각

  1. 순서가 있기 때문에 stack 혹은 queue 사용을 고려한다.
  2. 하루가 지날때마다 speeds의 값이 하나씩 증가하는 방식으로 하루가 지날때마다 개발 진척도가 결정될 것이기 때문에 반복문을 사용하고, 한번의 루프가 하루라고 생각하면 이해가 쉽다.

코드

def solution(progresses, speeds):
    stack = []
    day = 0
    cnt = 0

    while len(progresses) > 0:
        if progresses[0] + (day * speeds[0]) >= 100:
            progresses.pop(0)
            speeds.pop(0)
            cnt += 1
        else:
            if cnt > 0:
                stack.append(cnt)
                cnt = 0
            day += 1

    stack.append(cnt)

    return stack

코드 설명

문제의 예시 입출력1번인 progresses=[93, 30, 55], speeds=[1, 30, 5]를 기준으로 설명하려고 한다.

  1. 하루하루 지남을 표현할 day변수와 배포할 기능을 카운팅할 cnt 변수를 선언 및 초기화해준다.
  2. 기능 배포에는 순서가 있기 때문에 결국 progresses 리스트의 첫번째 요소가 개발이 완성되어야 뒤의 기능도 배포할 수 있다. 따라서 기준은 progresses 리스트의 첫번째 요소가 되며, 이에 매칭되는 개발 속도도 speeds 리스트의 첫번째 요소이다. 개발 속도 = day * speeds[0]이 되며 이 값을 현재 개발 진행률과 더했을 때, day값에 따른 개발 진행도가 구해진다. 이 값이 100 이상이 된다면, 이 기능은 배포가 가능한 것으로 판단한다.
  3. day 값이 7이 되기 전까지는 100 이상의 값을 만족하지 못하기 때문에 day += 1에서 day 값을 매 반복문마다 한번씩 증가하게 된다.
  4. day 값이 7이 되는 순간 93 + (7 * 1) >= 100을 만족하기 때문에 progresses, speeds 리스트에서 첫번째 요소를 지워주고, 이 기능은 배포를 할 수 있기에 cnt 값을 증가시켜준다.
  5. 두번째 값도 30 + (7 * 30) >= 100을 만족하기 때문에 첫번째 기능과 함께 배포를 하게 된다. 따라서 cnt값을 증가시켜준다.
  6. 세번째 값은 55 + (7 * 5) >= 100을 만족하지 못한다. 따라서 else절로 넘어가게 되는데, 이때 cnt 값이 0보다 크기 때문에(이미 2개의 기능은 배포할 계획이다.) 이 때의 cnt 값을 stack에 append시켜주고, 배포를 완료했으므로 cnt값은 다시 0으로 초기화시켜준다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함