본문 바로가기

알고리즘/프로그래머스

[파이썬] 프로그래머스 알고리즘 고득점 Kit - 큐 / 기능개발 완벽해설

문제

 

해설

 

 

즉 작업의 갯수 progresses가 있을 때, 각 프로그램들은 매 시간마다 speeds의 개발 속도만큼 개발이 진행된다. 여기서 주목해야 할 점은 "뒤의 기능이 먼저 개발될 수는 있으나, 앞의 기능이 배포될 때 기다렸다가 함께 배포됩니다." 라는 조건이 주어졌다. 즉 이 조건에서 앞에서부터 프로그램이 배포된다는 것을 통해서 큐 자료구조를 활용하라는 의미라고 추측할 수 있다.

 

 

큐 자료구조는 위처럼 First In First Out (FIFO)의 구조를 지니고 있다. 즉 첫번째로 들어간 요소가 가장 먼저 나가는 매커니즘을 가지고 있다. 참고로 이를 리스트를 활용하여 표현하면 Enqueue는 list.append(넣을 요소), Dequeue는 0번째 요소를 방출시키는 list.pop(0)이 될 것이다.

 

따라서 이 큐 자료구조를 활용해서 코드를 간편하게 작성할 수 있다.

 

코드의 구조는 크게 2가지로 나뉜다.

 

1. 매 시간마다 각 프로그램을 speeds 만큼 개발.

2. 매 시간마다 앞에서부터 개발 진척도가 100인 프로그램을 배포.

 

위의 두가지 기능을 반복적으로 돌려주면 되는 코드라고 할 수 있다. 반복문은 while과 하나의 조건으로 표현할 수 있을 것이다. 그리고 1번 while문의 조건으로는 배포할 프로그램이 아직 남아있을 경우에 해당하므로 "progresses가 존재할 때"의 조건을 넣어줄 것이고, 1번 while문 안에 2번 while 문을 넣어준 후, 2번 while문의 조건으로는 "progresses가 존재할 때", 그리고 "progresses의 0번째 요소가 개발이 완료되었을 때"로 둔 후, 개발이 완료된 프로그램들을 모두 배포(pop)하는 과정을 2번 while 코드문 안에 넣어주면 될 것이다.

 

그리고 2번 while문을 돌릴 때, pop을 할 때마다 배포한 프로그램의 갯수를 카운트해주고, 2번 while문이 모두 끝날 때 카운팅한 프로그램 갯수를 answer에 넣어주면 될 것이다.

 

이를 코드로 작성하면 아래의 코드와 같다.

 

코드
def solution(progresses, speeds):
    answer = []
    while (progresses):
        cnt = 0
        for i in range(len(progresses)):
            progresses[i] = min(progresses[i]+speeds[i],100)
        while (len(progresses)!=0) and (progresses[0]==100):
            progresses.pop(0)
            speeds.pop(0)
            cnt += 1
        if cnt != 0:
            answer.append(cnt)
    return answer

 

 

결과