1. 문제
https://programmers.co.kr/learn/courses/30/lessons/42586
2. 풀이
2.1. 내 풀이
- 각 프로세스마다 필요한 날을 올림 함수를 이용하여 구해줍니다.
- 이후로 배열을 하나하나씩 인덱스를 늘려가면서 시작 인덱스부터 뒤 인덱스에 같거나 작은 숫자가 올 때까지 같이 수행된 숫자로 여기고 정답에 집어 넣습니다.
import math
def solution(progresses, speeds):
need_day = [-1] * len(progresses)
for i in range(len(progresses)):
need_day[i] = math.ceil((100 - progresses[i]) / speeds[i])
# last_day를 기준으로 뒤를 조사하여 작거나 같은 요소들을 만나면 값을 1씩 증가시키고 아니면, last_day를 갱신합니다.
last_day = 0
answer = []
while True:
complete_num = 1
is_end = False
for i in range(last_day + 1, len(progresses) + 1):
if i == len(progresses):
is_end = True
break
if need_day[last_day] >= need_day[i]:
complete_num += 1
else:
last_day = i
break
answer.append(complete_num)
if is_end:
break
return answer
2.2. 숏코딩
- 기본적인 알고리즘은 위와 같으나 훨씬 짧은 코드입니다.
- zip을 이용하여 2개의 배열을 한 번에 사용하였습니다.
- progress 하나를 꺼내자 마자 바로 직전 값과 비교하여 정답 Q 를 갱신합니다.
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]
PREVIOUS[백준] 10830번 _ 행렬 제곱
NEXT[프로그래머스] 프린터 풀이