[프로그래머스] 기능개발



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]