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

김멉덥·2023년 9월 4일
0

알고리즘 공부

목록 보기
105/171
post-thumbnail
post-custom-banner

문제

프로그래머스 코딩테스트 고득점 Kit - 스택/큐


코드 구현

import math

def solution(progresses, speeds):
    answer = []

    # ([작업 진도], [개발 속도])
    # 첫번째 기능 -> 두번째 기능 -> 세번째 기능
    # 각 배포에 몇개의 기능이 배포되는지 return

    # 각 기능 개발에 어느정도의 기간이 걸리는지 개산하여 release_arr에 append
    release_arr = []
    for i in range(len(progresses)):
        release_arr.append(math.ceil((100 - progresses[i]) / speeds[i]))

    # release_arr을 돌면서 하나씩 꺼내면서 꺼낸 요소와 남아있는 요소를 순서대로 비교하기
    for j in range(len(release_arr)):
        if (len(release_arr) == 0):     # 비어있다면 break
            break

        count = 1
        tmp = release_arr.pop(0)    # 맨 앞 요소부터 꺼내어 비교하기

        # 비어있지 않을 때까지 배열 돌기
        while (release_arr):
            r = release_arr[0]      # 맨 앞 요소를 꺼냈으니 현재 0번째 인덱스는 꺼낸 맨 앞 요소의 바로 다음 요소
            if (r <= tmp):          # 만약 앞 기능의 개발 기간이 더 오래 걸린다면 -> 이번 기능은 그 앞 기능이 완료된 후 나올 수 있으므로 count + 1
                count += 1
                release_arr.pop(0)
            else:
                break

        answer.append(count)

    return answer

풀이

  • (100 - 현재 진도) / 속도 를 올림하면 현재 남은 진도를 완료하게 되는 기간이 나온다.
  • 해당 기간을 release_arr 배열에 넣어둔다.
  • 다음 for문에서 release_arr 배열을 하나씩 돌며 왼쪽부터 하나씩 꺼내어 비교한다. (큐처럼)
  • 맨 왼쪽 요소를 꺼내서 tmp 변수에 저장해둔 뒤, while문을 통해 왼쪽부터 시작해서 남아있는 기간들 중 해당 기능이 더 오래 걸려서 이 기능이 완성되고 난 후 배포가 같이 될 요소들을 카운트 한다.
  • while문을 다 돌고나서는 answer에 카운트 한 답을 차례대로 넣어준다.

What I learned

루프 하나로 한번에 돌게하는 정답 코드

def solution(progresses, speeds):
    print(progresses)
    print(speeds)
    answer = []
    time = 0
    count = 0
    while len(progresses)> 0:
        if (progresses[0] + time*speeds[0]) >= 100:
            progresses.pop(0)
            speeds.pop(0)
            count += 1
        else:
            if count > 0:
                answer.append(count)
                count = 0
            time += 1
    answer.append(count)
    return answer
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글