새소식

⌨️ Algorithms/프로그래머스

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

2022. 12. 15. 23:10

  • -

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 각 기능은 진도가 100%일 때 서비스에 반영
  • 각 기능의 개발속도는 모두 다름
    • 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포
    • => 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포 불가능
  • progresses: 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열
  • speeds: 각 작업의 개발 속도가 적힌 정수 배열
  • 각 배포마다 몇 개의 기능이 배포되는지를 return

제한사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하
  • 작업 진도는 100 미만의 자연수
  • 작업 속도는 100 이하의 자연수
  • 배포는 하루에 한 번만 가능, 하루의 끝에 이루어짐
    • ex) 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에

 

"""
입출력 예시)

progresses = [93, 30, 55], speeds = [1, 30, 5] -> [2, 1]
progresses = [95, 90, 99, 99, 80, 99], speeds = [1, 1, 1, 1, 1, 1] -> [1, 3, 2]
"""
# progresses = [93, 30, 55], speeds = [1, 30, 5] -> [2, 1]

# 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일 후 배포
# 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일 후 배포 가능. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 같이 배포됨
# 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일 후 배포
# => 7일째에 2개의 기능, 9일째에 1개의 기능이 배포

 

## 의사코드 ##

# 후입선출 -> 스택

# 각 기능마다 배포까지 남은 일수 계산

# if 스택 == []:
#   스택.append(남은 일수)
# else:
#   if 스택[-1] > 남은 일수:
#       스택.append(스택[-1])
#   else:
#       스택.append(남은 일수)

 

통과한 코드

 

import math
from collections import Counter

def solution(progresses, speeds):
    # 각 기능마다 배포까지 남은 일수 계산
    remain = []
    for i in range(len(progresses)):
        r = math.ceil((100 - progresses[i]) / speeds[i]) # math.ceil() -> 올림
        remain.append(r)
    
    # 각 기능마다 배포될 날짜를 스택에 삽입
    stack = []
    for r in remain:
        if stack == []: # 스택이 비어있으면
            stack.append(r)
        else: # 스택이 비어있지 않으면
            if stack[-1] > r: # 자신 직전 기능의 배포일이 자신의 배포일보다 크면 
                stack.append(stack[-1]) # 자신 직전 기능의 배포일을 삽입
            else:
                stack.append(r)
    answer = list(Counter(stack).values())
    return answer

 

-> 스택이라기보다는 그냥 리스트를 이용해서 풀었다

 

 

다른 풀이

 

큐를 이용한 풀이

def solution(progresses, speeds):
    # 결과를 담을 리스트
    answer = []
    # 작업 리스트가 빌 때까지 반복
    while progresses :
        # 몇 개의 기능이 배포되는지 저장 
        cnt = 0
        # 작업 리스트가 남아있고 맨 앞의 작업의 진도가 100인 경우
        while progresses and progresses[0] >= 100:
            cnt+=1 # 기능 배포 변수 증가
            # 해당 작업과 작업 속도를 리스트에서 제거
            progresses.pop(0)
            speeds.pop(0)

        # 작업 리스트의 진도를 증가
        progresses = [progresses[i]+speeds[i] for i in range(len(progresses))]

        # 만약 오늘 기능이 배포되었다면 결과 리스트에 추가
        if cnt:
            answer.append(cnt)
    
    return answer

 

https://happy-obok.tistory.com/38

 

[프로그래머스] 기능 개발 문제 풀이 (파이썬/ 큐)

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100% 일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이

happy-obok.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!