Algorithm/programmers/스택,큐/level2/기능 개발 (with python)

yellow·2021년 6월 17일
0

알고리즘 문제

목록 보기
41/58

📖 문제

📝 풀이 과정

  • 각 기능마다 진도가 100% 이상이 되는 날을 구해서
    그 날들을 담은 리스트를 순회하며 각 배포마다 몇개의 기능을 배포할 수 있는지 count하는 방식으로 문제를 풀었다.
  • 예를 들어 progresses = [93, 30, 45, 55], speeds = [1, 30, 10, 5]라 하면 각 기능마다 진도가 100% 이상이 되는 날은 각각 [7, 3, 6, 9]이다.
    1. 첫번째 기능이 7일 후에 배포가 가능하기 때문에, 첫 배포는 7일 후에 이루어진다.
      • 리스트 [7, 3, 6, 9]를 순회하면서 7보다 작은 수를 찾아서 첫 배포날에 배포할 수 있는 기능의 개수를 센다. -> 3번째 기능까지 배포할 수 있다.
      • 네번째 기능은 9일 후에야 배포가 가능해서 첫 배포날에는 배포될 수 없다.
    2. 3번째 기능까지 첫 배포날에 배포되었으므로 4번째 기능이 배포가 가능한 날이 두번째 배포날이다.
      • 남은 [9]를 순회하면서 9보다 작은 수를 찾아서 두번째 배포날에 배포할 수 있는 기능의 개수를 센다. -> 4번째 기능까지 배포할 수 있다.
    3. 따라서 정답은 [3, 1]이다.

⌨ 코드

def solution(progresses, speeds):
    answer = []
    # 배포가 며칠 후부터 가능한지를 담는 리스트
    distributable_day = []  
    
    for progress, speed in zip(progresses, speeds):
        # 진도가 100%가 될 때까지 걸리는 일수
        spend_days = 100 - progress
        
        if spend_days % speed == 0:
            distributable_day.append(spend_days // speed)
        # spend_days가 speed의 배수가 아니면 
        # 진도가 100%가 넘어가기 위해서는 spend_days를 speed로 나눈 값에 +1을 해준 만큼 걸린다.
        else:
            distributable_day.append(spend_days // speed + 1)

    # [배포하는 날, 배포되는 기능의 개수]
    day = [distributable_day[0],0]
    
    for d in distributable_day:
        # 배포가 가능한 기능이라면
        # (배포하는 날 이전에 이미 진도가 100%가 되었다면)
        if d <= day[0]:
            day[1] += 1 # 배포되는 기능의 개수 +1
        else:
            # 정답 리스트에 현재까지 배포할 수 있는 기능의 개수를 넣는다
            answer.append(day[1])
            # 배포하는 날 갱신
            day = [d, 1]        
    answer.append(day[1])
    return answer

☺ 느낀점

프로그래머스에서 알고리즘 유형을 스택/큐 라고 명시해주었지만 스택이나 큐를 사용하지 않고 풀었다. 만약 유형을 모르고 이 문제를 풀었다면 스택이나 큐를 써볼 생각을 하지 못했을 거라고 생각했기 때문이다.
그런데 제출하고 큐로 푼 사람들의 풀이를 보니 아무래도 '순차적으로 진행되는 작업'과 같은 주제의 문제는 큐를 사용해서 풀어야 더 깔끔하다는 것을 알게됐다.
하지만 문제 푸는 방식 자체에는 큰 차이가 없어 따로 블로그에 그 코드들을 가져오지는 않았다.

profile
할 수 있어! :)

0개의 댓글