카테고리 없음

[Level 2] 스택/큐. 기능개발

남쪽마을밤송이 2022. 2. 24. 03:04

 문제 

https://programmers.co.kr/learn/courses/30/lessons/42586?language=python3 

 

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

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

programmers.co.kr

 사용 언어 

Python3

 풀이 과정 

두 가지 방법으로 풀었다. 아래는 다른 사람 풀이를 보고 수정한 방식.

def solution(progresses, speeds):
    answer = []
    day = 0
    count = 0
    
    while len(progresses) > 0:
        if(progresses[0] + day*speeds[0] >= 100):
            progresses.pop(0)
            speeds.pop(0)
            count += 1
        else:
            if count > 0:
                answer.append(count)
                count = 0
            day += 1
    answer.append(count)
    return answer

위 답안은 코드의 가독성이 좀 더 좋은 대신 메모리와 소요 시간이 약~간 더 비효율적이었다. 내가 생각나는대로 푼 방식은 for문을 두 번 사용했고 메모리와 소요 시간은 아래와 같다.

풀이 과정 코드 결과
제출 답안 코드 결과

 제출 답안 

import math
def solution(progresses, speeds):
    answer = []
    days = []

    for i in range(len(progresses)):
        day = math.ceil((100 - progresses[i])/speeds[i])
        days.append(day) # 5, 10, 1, 1, 20, 1
    
    release = days[0] # 5
    count = 1
    for j in range(1, len(days)):
        if days[j] <= release:
            count += 1
        else:
            answer.append(count) # 1 3
            release = days[j] # 10 20
            count = 1
    answer.append(count) # 2
    return answer

 다른 사람 답안 

따로 공부한 내용보다 다른 사람 답안을 보고 배웠다.

def solution(progresses, speeds):
    Q=[]
    for p, s in zip(progresses, speeds):
        if len(Q)==0 or Q[-1][0]<-((p-100)//s):
            Q.append([-((p-100)//s),1])
        else:
            Q[-1][1]+=1
    return [q[1] for q in Q]

출처: 프로그래머스

zip() 메소드를 이용해서 기능의 작업률과 속도를 합쳐 계산이 쉽도록 했다.

-((p-100)//s) 부분은 필요한 작업일수를 구하는 계산식이다. 음수(-)로 몫을 구한 다음 다시 양수로 바꿔주었는데 math.ceil()을 적용한 것과 동일하다.

Q[i][0] 부분은 작업이 끝나기까지 필요한 일수이며, Q[i][1] 부분은 Q[i][0]일째에 배포 가능한 기능 수라고 보면 된다.

Q = [... , [days, functions]]

뒷 작업은 앞 작업이 끝나기까지 필요한 날짜와 비교해서 작으면 이미 앞작업에서 구했던 Q의 원소에서 기능수 부분에 +1 해주고 크면 list Q에 [필요한 일수, 기능수 = 1]의 형태로 새로 추가한다.

원소 개수 만큼 반복(for문)이 끝나면 배포 가능한 기능 수 부분만 잘라서 답을 리턴하는 코드이다.