-->

[프로그래머스] 스택/큐 - 기능개발 (파이썬)

프로그래머스 스택/큐 - 기능개발, 문제 확인

문제 설명은 아래와 같다.

 


각 기능은 진도가 100%일 때, 서비스에 반영할 수 있음

각 기능의 개발속도는 모두 다름

뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발되면, 앞에 있는 기능이 배포될 때 함께 배포됨

progress : 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열

speeds : 각 작업의 개발 속도가 적힌 정수 배열

배포는 하루에 한번 할 수 있음

예를 들어 진도율이 95%인 작업의 개발속도가 4%라면 배포는 2일 뒤에 이루어짐

각 배포마다 몇개의 기능이 배포되는지를 리턴

 

 

문제 설명만 봐서는 잘 이해가 가지 않으니 예시를 함께 보자. 첫 기능의 경우 93% 완료되어있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 된다. 두번째 기능은 같은 방식으로 3일 후 배포가 가능한데 이전 기능이 아직 완성되기 전이므로 7일째에 같이 배포된다. 세번째 기능은 9일간 작업 후 배포가 가능하기 때문에 리턴은 [2,1]이 되는 것이다.

 

progresses

speeds

return

[93,30,55]

[1,30,5]

[2,1]

 

 

프로그래머스 스택/큐 - 기능개발, 문제 풀이 (파이썬)

제일 먼저, prog와 speed를 통해 각 기능마다 배포까지 걸리는 시간을 계산한 후 해당 값들로 day 리스트를 생성한다.

 

day=[]
answer=[]
    
#걸리는 시간들 구하기 (day list)
for p,s in zip(prog,speed):
	tmp=(100-p)//s
	if (100-p)%s>0: tmp=tmp+1
	day.append(tmp)

 

 

걸리는 시간을 전부 계산해놓은 day 리스트에 대해 반복문을 돌며 해당 값이 max 값인지, max보다 작거나 같은지를 확인하는 방식으로 리턴할 리스트의 요소 값을 추가하거나 이전 값에 +1을 해주거나 하는 방식을 사용했다. 초기값은 무조건 max이므로 max로 설정해주고 answer 리스트에 1을 추가해준다. day 리스트가 [7,7,9]라고 한다면 max값은 7이되고 answer 리스트는 [1]이 된다.

 

#리스트에 직접 카운트하는 방식 + enumerate 사용
for i,d in enumerate(day):
	#초기값을 max값으로 세팅
	if i==0:
		max=d
		answer.append(1)
		continue

 

 

만약에 day 리스트의 값이 max값보다 작거나 같다면 앞에 더 큰 작업시간을 가진 기능과 같이 배포가 되어야 하므로 answer의 마지막 요소에 +1을 해준다. day 리스트 [7,7,9]에서 두번째 7일 경우 max값인 7보다 7이 작거나 같으므로 answer 리스트가 [2]가 된다.

 

#max보다 시간이 더적게걸린다면 이전값 +1 (리스트 [-1] 사용)
if d<=max:
	answer[-1]+=1

 

 

이제 마지막 조건문이다. max보다 큰 작업시간을 가진 기능이 있다면 해당 값을 max로 갱신하고 answer 값에 새로운 1값을 추가해준다. day 리스트가 [7,7,9]에서 마지막 요소인 9를 예로 들면, 현재 max 값인 7보다 크므로 answer 리스트는 [2,1]이 된다.

 

#현재값이 max라면 max를 갱신하고 answer요소를 새로 추가
else:
	max=d
	answer.append(1)

 

 

전체 코드는 아래와 같다.

 

def solution(prog, speed):
    day=[]
    answer=[]
    
    #걸리는 시간들 구하기 (day list)
    for p,s in zip(prog,speed):
        tmp=(100-p)//s
        if (100-p)%s>0: tmp=tmp+1
        day.append(tmp)
    
    #count를 제거하고 리스트에 직접 카운트하는 방식 + enumerate 사용
    for i,d in enumerate(day):
        #초기값을 max값으로 세팅
        if i==0:
            max=d
            answer.append(1)
            continue
            
        #max보다 시간이 더적게걸린다면 이전값 +1 (리스트 [-1] 사용)
        if d<=max:
            answer[-1]+=1
            
        #현재값이 max라면 max를 갱신하고 answer요소를 새로 추가
        else:
            max=d
            answer.append(1)
            
    return answer

 

 

아래와 같이 모든 테스트케이스를 통과하는 것을 볼 수 있다.

 

 

댓글

Designed by JB FACTORY