[Python] 프로그래머스-기능개발(반복문, stack)

hannah·2024년 6월 26일
0

algorithm

목록 보기
3/11
post-thumbnail

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.


제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력 예제

progressesspeedsreturn
[93, 30, 55][1, 30, 5][2, 1]
[95, 90, 99, 99, 80, 99][1, 1, 1, 1, 1, 1][1, 3, 2]

우선, 아래의 두 코드 모두, progresses와 speeds를 zip메서드를 사용해서 하나로 묶어주었고, 그 리스트를 수치 100에서 speed를 올림처리하여 남은 일수가 며칠인지 한번에 계산해주었다.


코드 작성

1. 반복문 활용

import math
def solution(progresses, speeds):
    func=list(zip(progresses, speeds))
    left=[math.ceil((100-progress)/speed) for progress,speed in func]
    cnt=1
    curr=left[0]
    solv=[]
    for i in range(1,len(left)):
        if curr<left[i]:
            solv.append(cnt)
            cnt=1
            curr=left[i]
        else:
            cnt+=1
    solv.append(cnt)
    return solv

curr에 첫번째 값을 초기화하여 변수를 선언하고 반복문을 돌면서 이후에 오는 값이 curr보다 작거나 같으면 cnt를 더해주고 크면, 그동안에 cnt된 값을 solv 리스트에 추가한 후, 초기화했다. 또한, 그때 left의 원소값으로 curr 값으로 갱신해주었다. 반복문을 다 돈 이후에는 마지막 cnt를 append 하는 방식..! 글로는 복잡해보이지만 코드를 보면 이해하는데 어렵지 않을 것이다.

결과


구상했던대로 코드를 짜서 해결했지만, 스택/큐 문제이니만큼 다른 방식으로도 풀어봤다.

2. stack 사용

import math
def solution(progresses, speeds):
    func=list(zip(progresses, speeds))
    left=[math.ceil((100-progress)/speed) for progress,speed in func]
    solv=[]
    stack=[]
    for el in left:
        if not stack or max(stack)>=el:
            stack.append(el)
        else:
            solv.append(len(stack))
            stack=[]
            stack.append(el)
    solv.append(len(stack))
    return solv

사실 문제에서 의도한대로 stack을 사용한건지는 모르겠다. 이전코드에서는 cnt라는 변수를 선언해서 그 갯수를 solv에 넣어주었다면 이 풀이에서는 stack에 남아있는 length를 그대로 append해줬다. 크게 보면 동작방식은 다르지 않다!

결과


해결!

0개의 댓글