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

SeongWon Oh·2021년 7월 20일
0
post-thumbnail

🔗 문제 링크

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


👨🏻‍💻 내가 작성한 코드

def solution(progresses, speeds):
    answer = []
    front = 0
    count = 1
    for i in range(100):
        for j in range(len(progresses)):
            progresses[j] += speeds[j]
            
        if progresses[front] >= 100:
            for k in range(front+1, len(progresses)):
                if progresses[k] >= 100:
                    front += 1
                    count += 1
                else:
                    break
            front += 1
            answer.append(count)
            
            count = 1

        if front == len(progresses):
            print(answer)
            break
                    
    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]의 형태로 새로 추가한다. 원소 개수 만큼 반복이 끝나면 배포 가능한 기능 수 부분만 잘라서 답을 리턴하면 된다.

📝 결론

문제 풀이를 마치고 다른 사람의 코드를 보며 zip이라는 내장함수에 대해 다시 한번 알게 되었다. 과거 파이썬을 배우면서 이론으로만 배우고 실제로는 사용한 적이 없는 함수였으나 이러한 문제풀이를 할 때 zip 함수를 사용하면 코드가 보다 간결해지고 효율성도 좋게 나온다는 것을 깨달으며 앞으로 zip 함수의 사용도 고려하며 코딩을 하여야겠다는 생각을 했다.

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글