알고리즘/프로그래머스

[프로그래머스 / Python] 기능개발 | 초코더

cloud_nice 2020. 8. 18. 17:56

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 ��

programmers.co.kr

 

문제

작업진도와 작업속도가 주어질 경우 각 배포마다 몇개의 기능이 수행되는지 구하는 함수

 

접근법

1. 각 작업이 완료되기까지 몇일이 걸리는지를 days리스트를 구해줌

   1-1.  각작업의 속도를 계속 더해주면서 한번 더할 때마다 cnt도 증가시켜줌

   1-2. 100보다 커지는 지점의 cnt를 저장해주면 그것이 완료되는 날짜

 

2. 예제처럼 작업진도와 속도가 주어졌을 경우 days는 [7,3,9]가 나온다.

작업진도 작업속도
[93,30,55] [1,30,5]

3. 배포마다 몇개의 기능이 수행되는지 구하는 부분

   3-1. days가 [7,3,9]일경우, 7다음 원소들을 비교.

         if days원소가 하나밖에 없을경우, 비교할게 없으므로 ans를 fun_cnt리스트에 저장하고 days.pop()하고 종료.

   3-2. 7다음원소가 3과같이 작을경우, ans를 증가시키고 3을 제거해줌 (ans초기값은 1임 !! 자기자신포함하기때문)

   3-3. 7다음원소가 9와같이 클경우, 이전에 7보다 작은 원소들의 개수가 저장된 ans를 fun_cnt리스트에 저장해줌

                                              , ans를 1로 초기화시키고 7을 제거해줌

   3-1 ~ 3-3까지의 과정을 days가 빌때까지 반복한다.

 

전체코드

def solution(progresses,speeds):
    #days는 각 기능개발이 몇일 걸리는지 저장하는 리스트
    days=[]
    #speed만큼 더해주면서 100을 넘기는 지점의 날짜를 리턴해서 days에 저장
    for i in range(len(progresses)):
        s=progresses[i]
        cnt=0
        while s<100:
            s+=speeds[i]
            cnt+=1
        days.append(cnt)

    #days
    ans=1
    fun_cnt=[]
    i=1
    while days:
        if len(days)==1:
            fun_cnt.append(ans)
            days.pop()
        #다음원소가 작을경우 다음원소제거하고 ans증가
        elif days[i-1]>=days[i]:
            ans+=1
            days.pop(i)
        #다음원소가 클경우 이전원소제거하고 ans를 리스트에 저장시키고 ans초기화
        else:
            fun_cnt.append(ans)
            days.pop(i-1)
            ans=1

    return fun_cnt

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