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가 비어있거나, 현재 기능의 완료일이 이전 배포일보다 늦으면 새 배포 그룹을 만든다.
그렇지 않으면 현재 배포 그룹의 기능 수만 추출하여 반환한다.
'프로그래머스 > 알고리즘 고득점 Kit' 카테고리의 다른 글
[프로그래머스] [스택/큐] Lv.2 /프로세스 (파이썬/Python) (0) | 2025.04.08 |
---|---|
[프로그래머스] [스택/큐] Lv.2 /올바른 괄호 (파이썬/Python) (0) | 2025.04.05 |
[프로그래머스] [스택/큐] Lv.1 /같은 숫자는 싫어 (파이썬/Python) (0) | 2025.03.29 |
[프로그래머스] [해시] Lv.3 /베스트앨범 (파이썬/Python) (0) | 2025.03.28 |
[프로그래머스] [해시] Lv.2 /의상 (파이썬/Python) (0) | 2025.03.27 |