[프로그래머스] 기능개발 문제풀이 python

mauz·2022년 5월 24일
0

🐒 문제

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

✍ 나의 풀이

from collections import deque

def solution(progresses, speeds):
    answer = []
    prog = deque(progresses)
    spd = deque(speeds)

    while prog:
        for i in range(len(prog)):
            prog[i] += spd[i]

        tmp = 0
        try:
            while prog[0] >= 100:
                tmp += 1
                prog.popleft()
                spd.popleft()
        except:
            pass

        if tmp > 0:
            answer.append(tmp)

    return answer

🧠 문제 이해

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

각 기능의 개발속도는 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

예시로

입력
progress = [93, 30, 55]
speeds = [1, 30, 5]


3일뒤 두번째 작업은 100%가 되어 배포가 가능해지지만,
그 앞의 첫번째 작업이 96%로, 아직 배포되지 않아 두번째 작업은 기다려야한다.

7일뒤 첫번째 작업은 100%가 되어 배포가 가능하다. 두번째 작업또한 100%이므로 배포가 가능하다. 따라서 당일에는 두 개의 작업이 배포된다.

9일뒤 세번째 작업이 100%가 되어 배포가 가능하다. 당일에는 한 개의 작업이 배포된다.

출력
answer = [2,1]

위와 같은 흐름의 프로그램을 만들어야한다,

이 문제가 큐/스택 카테고리에 속한 걸 먼저 보았기에 쉽게 접근 할 수있었다.

나는 문제를 보고 영상편집 프로그램 인코딩 시에 작업들이 큐에 저장되는 것이 연상되어 이 문제에서 큐 자료구조를 사용하기로 하였다.

순차적으로 완료된 작업들은 큐에서 삭제되는 아이디어이다.


코드 설명

from collections import deque
 # 큐 자료구조를 사용하기위해 collcetions 라이브러리에서 deque 클래스를 불러왔다.

def solution(progresses, speeds):
    answer = []
    prog = deque(progresses)	# 작업들의 진행도를 큐에 넣는다.
    spd = deque(speeds)		# 작업속도도 다른 큐에 넣는다.

    while prog:		# 작업들이 남아있다면
        for i in range(len(prog)):	
            prog[i] += spd[i]
            #작업의 현재 진행도에 작업 속도를 더해준다.

        tmp = 0		# 당일 배포할 작업들 개수를 저장할 변수
        try:	# 인덱스 에러 발생시 예외처리
            while prog[0] >= 100:	# 첫번째 작업이 완료되었다면,
                tmp += 1	# 배포할 작업 개수 1 추가
                prog.popleft()	# 완료된 첫번째 작업을 큐에서 없애기
                spd.popleft() # 완료된 첫번째 작업의 작업속도도 큐에서 없애기
        except:	# poplfet로 인해서 prog에 남은 요소가 없으면 인덱스 에러가 발생한다.
            pass

        if tmp > 0:	# 당일 배포할 작업이 있다면 
            answer.append(tmp)	# answer 리스트에 당일 배포할 작업의 갯수를 append

    return answer

문제 풀 당시에는 try execpt가 가장 깔끔하다 생각했는데

	while prog[0] >= 100:
		tmp += 1
		prog.popleft()
		spd.popleft()
            
		if not prog: #<<<<< try except문 대신 사용
			break

	if tmp > 0:
		answer.append(tmp)

그냥 if 문으로 prog가 비었는지 판단하며 더 간단하게 나타낼 수도 있었다.


profile
쥐구멍에 볕드는 날

0개의 댓글