프로그래머스_기능개발(2)

임정민·2024년 1월 22일
0

알고리즘 문제풀이

목록 보기
148/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 24분


from collections import deque

def solution(progresses, speeds):
    answer = []
    
    progresses = deque(progresses)
    speeds = deque(speeds)
    
    while progresses:
        
        for i in range(len(progresses)):
            progresses[i] += speeds[i]
        
        first_prg = progresses[0]
        deploy = 0        
        
        if first_prg>=100:
            for prg in progresses:
                if prg>=100:
                    deploy += 1
                else:
                    break
            answer.append(deploy)
            
            for i in range(deploy):
                progresses.popleft()
                speeds.popleft()
                
    return answer

개발해야하는 기능의 갯수(progresses)와 기능별 개발 속도(speeds)가 주어지고 맨 기능이 100% 개발이 되었을 때마다 그 뒤 100% 개발 완료된 기능들을 한번에 배포한다고 했을때 배포별 개발 완료 기능 갯수를 구하는 문제입니다.🐾🐾🐾

앞에서부터 순차적으로 확인해야하므로 Queue구조를 활용하였고 개발 속도(speeds)를 순서대로 더한 뒤 완료된 기능이 있을 때, 해당하는 기능,속도를 popleft()하는 방식으로 구현하였습니다.

[다른 사람의 풀이1]

def solution(progresses, speeds):
    Q=[]
    for p, s in zip(progresses, speeds):
        if len(Q)==0 or Q[-1][0]<-((p-100)//s):
            Q.append([-((p-100)//s),1])
        else:
            Q[-1][1]+=1
    return [q[1] for q in Q]

개발해야하는 기능(progresses), 개발 속도(speeds) 두 리스트를 zip()으로 결합한 뒤 한번에 for문을 돌리면서 현재 기능과 이전 기능 개발의 소요 기간을 비교하여

만약 동일한 기간 내에 완료된다면 기존 [소요 기간, 소요기간 내 개발 기능 갯수]의 1번 인덱스에 += 1 하고 더 오래걸린다면 새로 [소요 기간, 소요기간 내 개발 기능 갯수]을 append하는 방식입니다.🕊️🕊️🕊️

for문 1번으로 해결할 수 있는 가장 간결한 풀이였습니다.

[다른 사람의 풀이2]


import math

def solution(progresses, speeds):
    progresses = [math.ceil((100 - a) / b) for a, b in zip(progresses, speeds)]
    answer = []
    front = 0, 0

    for idx in range(len(progresses)):
        if progresses[idx] > progresses[front]:  
            answer.append(idx - front)
            front = idx 
    answer.append(len(progresses) - front)  

    return answer

'다른 사람의 풀이1'과 유사한 구조이되 완료된 가장 앞의 기능을 front라는 포인터를 기억하여 활용하는 방식입니다.

front가 가리키는 기능과 현재 기능의 소요기간을 비교한 뒤 이미 완료된 기능보다 소요기간이 더 필요하다면 완료된 기능까지의 갯수를 answer에 추가하고 front를 현재기능으로 초기화하여 다시 비교하는 풀이입니다.🐇🐇🐇

'다른 사람의 풀이1'보다 훨씬 가독성 좋은 형태로, 더 쉽게 이해할 수 있었습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글