[프로그래머스/Lv2] 기능개발

2022. 11. 1. 12:46

문제

프로그래머스 팀에서는 기능 개선 작업을 수행 중이다.

각 기능은 진도가 100% 이상일 때 서비스에 반영할 수 있다.

 

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

 

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 반환하는 함수를 만들어야 한다.

 

 

제한사항

1. 작업의 개수(progresses, speeds 배열의 길이)는 100개 이하이다.

2. 작업 진도는 100 미만의 자연수이다.

3. 작업 속도는 100 이하의 자연수이다.

4. 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정한다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어진다.

 

 

코드 

def solution(progresses, speeds):
    answer = []
    while len(progresses) >= 1:
        while progresses[0] < 100:
            tmp = []
            for progress, speed in zip(progresses, speeds):
                tmp.append(progress + speed)
            progresses = tmp.copy()
    
        sum = 0
        try:
            while progresses[0] >= 100:
                sum += 1
                del progresses[0]
                del speeds[0]
        except:
            pass
        answer.append(sum)

    return answer

 

 

설명

일단 첫번째 기능의 작업 진도가 100 이상이 되도록 반복한다.

첫번째 기능의 작업 진도가 100 이상이 되면 작업 진도들을 검사하여

순서대로 100 이상인 것들을 체크해준다.

체크된 작업 진도와 그 작업에 해당하는 개발 속도를 제거하고

위의 과정을 반복한다.

 

위 과정을 코드로 그대로 옮겼다.

 

answer = []

정답을 담을 배열이다.

 

while len(progresses) >= 1:

progresses 배열의 길이가 0이 되면 반복이 종료된다.

 

while progresses[0] < 100:
	tmp = []
	for progress, speed in zip(progresses, speeds):
		tmp.append(progress + speed)
	progresses = tmp.copy()

progresses 배열의 첫번째 원소가 100이거나 100보다 크면 반복이 종료된다.

progresses 배열의 원소와 speeds 배열의 원소를 각각 더해 tmp 배열에 append 해둔다.

안쪽 반복이 끝나면 tmp 배열의 복사본을 progresses 배열에 옮긴다.

 

첫번째 작업 진도를 100 이상으로 만드는 작업이다.

 

sum = 0
	try:
		while progresses[0] >= 100:
			sum += 1
			del progresses[0]
 			del speeds[0]
	except:
		pass

하루에 배포될 기능의 수를 sum으로 표현한다.

progresses 배열의 첫번째 원소가 100보다 작을 경우 반복이 종료된다.

반복하면서 sum에 1을 더하고

progresses 배열과 speeds 배열의 첫번째 원소를 제거한다.

 

이 과정에서 남아 있는 모든 작업 진도가 100 이상일 경우 배열이 비게 되는데(len가 0)

이 때 IndexError가 발생하기 때문에 try, except 문을 활용하여 에러가 발생하면 아무 작업을 하지 않도록 한다.

 

answer.append(sum)

구한 sum을 answer에 append 해준다.

 

return answer

가장 바깥의 반복문이 끝나면 answer를 반환한다.

BELATED ARTICLES

more