프로그래밍/Algorithm

프로그래머스 기능개발 파이썬

모지사바하 2021. 11. 25. 19:58

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

 

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

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

programmers.co.kr

 

 

처음엔 아래와 같이 풀었다

def solution(progresses, speeds):
    answer = []
    temp = 0
    while progresses:
        if progresses[0] >= 100:
            del progresses[0]
            del speeds[0]
            temp += 1
        else:
            if temp > 0:
                answer.append(temp)
            temp = 0
            for i in range(len(progresses)):
                progresses[i] += speeds[i]

    if temp > 0:
        answer.append(temp)
    print(answer)

    return answer

1. 배열을 순회한다

 

2. 100점 이상인 점수를 만나면 배포카운트를 1 증가한다

 

3. 100점 미만인 점수를 만나면 배포카운트가 0 이상인 경우, 그동안 증가된 배포카운트를 정답에 저장한다.

 

4. 배포카운트를 0으로 초기화한다

 

5. 전체 배열을 순회하며 속도만큼 값을 누적한다

 

6. 마지막으로 남은 배포카운트가 있다면 정답에 저장한다

 

 

 

좀 더 효율이 좋은 풀이

from collections import deque


def solution(progresses, speeds):
    answer = []
    progresses = deque(progresses)
    speeds = deque(speeds)

    count = 0
    time = 0
    while progresses:
        if progresses[0] + speeds[0] * time >= 100:
            count += 1
            progresses.popleft()
            speeds.popleft()
        else:
            if count > 0:
                answer.append(count)
                count = 0

            time += 1

    answer.append(count)
    return answer


print(solution([93, 30, 55], [1, 30, 5]))

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

 

배열의 첫번째 원소를 빼야할 일이 많기 때문에 효율을 높이기 위해 deque 를 사용하였다.

 

기본원리는 첫번째 풀었던 것과 큰 차이는 없으나

time 이라는 개념을 도입하여 첫번째 속도와 time 을 곱하고 진척률을 더한 값이 100이 넘는지 검사하여 while 내 for loop 를 없애 효율을 높였다.