본문 바로가기
알고리즘/프로그래머스 PS

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

by 빛밤하늘 2021. 7. 27.
반응형

밑의 링크는 프로그래머스에서의 문제 링크입니다.

 

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

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

programmers.co.kr

 

 

 

 

 

 

 

 

주의해야 할 

progresses에서 뒤에 있는 기능의 개발 일정이 앞에 있는 기능의 개발 일정보다 먼저 끝날 수 있다 하더라도,

progresses에서 앞에 있는 기능이 먼저 배포돼야 뒤에 있는 기능을 배포할 수 있습니다.

 

 

 

생각한 풀이 과정

  1. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 리스트 progresses와 각 작업의 개발 속도가 적힌 정수 리스트 speeds, 두 리스트에서 작업 순서를 뜻하는 인덱스는 같습니다.
  2. 이전까지의 기능에서 배포하기까지 걸린 일수를 저장할 변수를 하나 만들어줍니다.
  3. 기능을 하나씩 반복해봅니다.
  4. 현재 기능의 개발을 완성하고 배포까지의 일수를 계산합니다.
  5. 2번 과정의 변수인 이전까지의 기능을 배포하기까지 걸린 일수가 4번 과정의 현재 기능 배포 일수보다 크거나 같다면, 이전 기능을 배포해야 현재 기능도 배포할 수 있으므로, 이전 기능을 배포할 때 현재 기능을 같이 배포하면 됩니다.
  6. 2번 과정의 변수인 이전까지의 기능을 배포하기까지 걸린 일수가 4번 과정의 현재 기능 배포 일수보다 작다면, 이전 기능은 이미 배포가 되었을 것이므로, 현재 기능은 이전 기능과는 따로 배포됩니다.

 

 

 

 

 

 

 

제출한 파이썬 코드

# 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 리스트 pregresses,
# 각 작업의 개발 속도가 적힌 정수 리스트 speeds가 매개변수로 주어집니다.
def solution(progresses, speeds):
    # 각 배포마다 배포되는 기능의 개수를 저장할 리스트 변수를 선언합니다.
    answer = []
    # 기능의 개수를 저장하는 변수를 선언합니다.
    progresses_len = len(progresses)
    # 가장 최근에 배포되었을 때까지 걸린 작업 일수를 저장할 변수를 선언합니다.
    prev_work_day = None

    # 기능 하나마다 반복해봅니다.
    for idx in range(progresses_len):
        # 현재 기능의 작업의 진도를 저장하는 변수를 선언합니다.
        progress = progresses[idx]
        # 현재 기능의 개발 속도를 저장하는 변수를 선언합니다.
        speed = speeds[idx]
        # 현재 기능을 개발하는데 걸리는 작업 일수를 저장하는 변수를 선언합니다.
        work_day = (100 - progress) // speed

        # 만약 남은 진도를 개발 속도로 나누었을 때 나머지가 0이 아니라면
        if (100 - progress) % speed != 0:
            # 작업 일수에 1을 더해줍니다.
            work_day += 1

        # 아직 배포된 기능이 없다면
        if prev_work_day == None:
            # prev_work_day에 work_day의 값을 넣어줍니다.
            prev_work_day = work_day
            # answer에 1을 넣어줍니다.
            answer.append(1)
        # 현재 기능의 작업 일수가 prev_work_day보다 작거나 같다면
        elif work_day <= prev_work_day:
            # 현재 기능은 가장 최근에 배포한 기능을 배포할 때 같이 배포하므로
            # answer의 가장 끝 값에 1을 더해줍니다.
            answer[-1] += 1
        # 현재 기능의 작업 일수가 prev_work_day보다 크다면
        elif work_day > prev_work_day:
            # 가장 최근에 배포한 기능을 배포한 이후에 배포할 수 있으므로
            # answer에 1을 넣어줍니다.
            answer.append(1)
            # prev_work_day에 work_day의 값을 넣어줍니다.
            prev_work_day = work_day

    # 각 배포마다 배포된 기능의 개수를 저장한 리스트를 반환합니다.
    return answer

 

 

 

제출 결과

결과

 

 

 

 

 

 

 

느낀 점

문제 카테고리에 '스택/큐'라고 되어있는데

스택이나 큐를 굳이 의식하지 않고 푼 문제입니다.

스택이나 큐를 사용하면 더 효율적인 코드를 짤 수 있는지 궁금하네요.

다른 사람들의 코드도 보고 공부해야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글