본문 바로가기

두두의 알고리즘/문제

[큐] 프로그래머스 L2 '기능개발' (Python)

728x90

<문제 링크>

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

 

코딩테스트 연습 - 기능개발

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

programmers.co.kr


<문제 풀이>

  1. 100이 될 때까지 while문?
  2. speeds를 100이 될 때까지 더하는 for문?
  3. progresses가 100이 되면 answer +=1 하고 순서대로 삭제

<코드>

#1차시도 : 1,5 런타임에러, 2 실패

def solution(progresses, speeds):
    queue = []
    finish = [] 
    
    for i in range(len(progresses)):
        queue.append((100-progresses[i])/speeds[i]) 
        finish.append((100-progresses[i])/speeds[i])
    
    for i in range(1, len(finish)):
        if finish[i-1]>finish[i]:
            finish[i] = finish[i-1]
            
    answer = [1] * len(set(finish))

    i=0
    while len(queue)>len(answer):
        if queue[i]>queue[i+1]:
            answer[i] += 1
            queue.pop(i+1)
            i-=1
        i+=1
        
    return answer

 

#progresses = [99,99,99,99,99], speeds = [3,3,3,3,3] 테스트케이스
#2차시도 : 2 실패
def solution(progresses, speeds):
    queue = []
    finish = [] 
    
    for i in range(len(progresses)):
        queue.append((100-progresses[i])/speeds[i]) 
        finish.append((100-progresses[i])/speeds[i])
    
    for i in range(1, len(finish)):
        if finish[i-1]>finish[i]:
            finish[i] = finish[i-1]
            
    answer = [1] * len(set(finish))

    i=0
    while len(queue)>len(answer):
        if queue[i]>=queue[i+1]:
            answer[i] += 1
            queue.pop(i+1)
            i-=1
        i+=1
        
    return answer

 

#progresses = [5, 5, 5], speeds = [21, 25, 20] 테스트케이스
#3차시도

import math
def solution(progresses, speeds):
    queue = []
    finish = [] 
    
    for i in range(len(progresses)):
        queue.append(math.ceil((100-progresses[i])/speeds[i]))
        finish.append(math.ceil((100-progresses[i])/speeds[i]))
    
    for i in range(1, len(finish)):
        if finish[i-1]>finish[i]:
            finish[i] = finish[i-1]
            
    answer = [1] * len(set(finish))

    i=0
    while len(queue)>len(answer):
        if queue[i]>=queue[i+1]:
            answer[i] += 1
            queue.pop(i+1)
            i-=1
        i+=1
        
    return answer

 

<고쳐야 할 점>

  • zip, 2차원 배열 자유자재로 사용하기
  • 올림. math.ceil 기억하기