프로그래머스/알고리즘 고득점 Kit

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

junslee 2025. 3. 31. 17:44

1. 문제 설명

2. 코드 

def solution(progresses, speeds):
    answer = []
    days_left = []
    
    for p, s in zip(progresses, speeds):
        import math
        days = math.ceil((100 - p) / s)
        days_left.append(days)
    
    count = 1
    max_days = days_left[0] 
    
    for i in range(1, len(days_left)):
        if days_left[i] > max_days:
            answer.append(count) 
            count = 1 
            max_days = days_left[i] 
        else:
            count += 1
    
    answer.append(count)
    
    return answer

3. 풀이 과정

답을 넣을 answer와 필요한 일수를 넣을 days_left를 빈 리스트로 초기화한다.

progresses와 speeds를 zip()으로 묶어 p와s로 받는다.

올림 처리를 할 함수 ceil()를 불러오기 위해 math를 import해서 (100-p)/s를 계산해 올림 처리한다.

일수를 days_left에 append()로 추가한다.

배포 횟수 count를 1로 초기화한다.

첫번째 배포일을 max_days 로 day_left[0]으로 받는다.

1부터 day_left의 길이를 인덱스 i로 받는다.

days_left[i]가 max_days보다 크면 

answer에 count를 appned()로 추가한다.

count는 1로 초기화한다.

max_days = days_left[i]로 최대 완료일을 갱신한다.

max_days보다 작거나 같으면 count값을 1 더한다.

for문을 빠져 나오면 answer에 count를 appned()하고, answer를 반환한다.

 

4. 추천 코드

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]

5. 추천 코드의 풀이 과정

Q는 배포 그룹을 저장하는 리스트이다. 각 요소는 [배포일, 기능 수] 형태이다.

zip(progresses, speeds)로 각 기능의 진도와 속도를 동시에 순회한다.

-((p-100)//s)는 각 기능이 완료되는데 필요한 일수를 계산한다.

p-100는 남은 작업량으로 음수값이고 //으로 올림 효과를 준다. -를 붙여 양수로 변환한다.

Q가 비어있거나, 현재 기능의 완료일이 이전 배포일보다 늦으면 새 배포 그룹을 만든다.

그렇지 않으면 현재 배포 그룹의 기능 수만 추출하여 반환한다.