[프로그래머스] 기능개발 python

kiki·2022년 2월 24일
0

프로그래머스

목록 보기
6/74

문제 링크

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

문제 설명

progresses 리스트와 speeds 리스트가 주어진다. progresses는 진행 현황, speeds는 하루에 진행 가능한 정도. 며칠에 몇개의 기능을 배포를 할 수 있을지 리턴한다. 설명하자니 어려우니 스크린샷

여기서 중요한건 앞의 기능이 다 개발되지 않으면 뒤에 것이 개발이 다 됐다고 해도 배포될 수 없고, 앞의 것이 배포될 때 함께 배포된다.

1차 시도

def solution(progresses, speeds):
    stack = list(reversed(progresses))
    speed = list(reversed(speeds))
    answer = []
    while(stack != []):
        cnt = 0
        for i in range(len(stack)-1,-1,-1):
            stack[i]+=speed[i]
        for i in range(len(stack)-1,-1,-1):
            if(i==len(stack)-1):
                if(stack[i]>=100):
                    cnt+=1
                    stack.pop()
                else:
                    break
        answer.append(cnt)
    return [i for i in answer if(i!=0)]
  • 1차 시도에 바로 성공한 건 아니고 한 며칠.... 고민하다가 풀어냈다.
  • 주어진 리스트를 뒤집어서 나름의 스택으로 사용하는 방식이다 (스택이 맞는지는 아무도 보장 안해줌)
  • 그래서 가장 top에 있는게 완성되면 뒤에 있는 것도 완성되었다면 함께 배포될 수 있는.
  • 꽤 괜찮은 코드라고 생각했지만... 너무 일차원적인 풀이였다. 그냥 문제에 나온대로 풀어내는
  • 살짝의 문제를 겪었던 부분은 reversed 이다. reversed의 return은 뒤집힌 리스트를 반환하는게 아니라 reversed 객체를 반환한다! 반면에 reverse는 해당 리스트 자체를 뒤집어버린다.

2차 시도

import math
def solution(progresses,speeds):
    q = []
    answer = []
    for p,s in zip(progresses, speeds):
        q.append(math.ceil((100-p)/s))
    print(q)
    i=0
    cnt = 1
    for j in range(1, len(q)):
        if(q[i]>=q[j]):
            cnt+=1
        else:
            answer.append(cnt)
            cnt=1
            i=j
    answer.append(cnt)
    return answer
  • 다른 사람의 풀이를 보고 내가 이해되는 부분만 작성해본 코드이다.
  • 그냥 문제대로 차곡차곡 더해가면서 조건을 확인하는게 아닌 남은 일수를 구해서 풀어내는 방식이다.
  • 근데... 코드가 지저분하다.
  • 마지막에 마지막 요소를 처리해주기 위해 지저분하게 for문 밖에서 append를 해줬다

3차 시도 - 다른사람의 풀이

def solution(progresses, speeds):
    daysLeft = list(map(lambda x: (ceil((100 - progresses[x]) / speeds[x])), range(len(progresses))))
    count = 1
    retList = []

    for i in range(len(daysLeft)):
        try:
            if daysLeft[i] < daysLeft[i + 1]:
                retList.append(count)
                count = 1
            else:
                daysLeft[i + 1] = daysLeft[i]
                count += 1
        except IndexError:
            retList.append(count)

    return retList
  • 2차 시도에서 살짝의 어려움을 겪었던 부분이 있다면 마지막 요소를 처리해주는 부분에 있어 깔끔하지 못한 코드를 작성했는데 이 코드에선 try, except를 사용해서 마지막 요소를 처리해줬다. 깔끔
  • 그리고 map 함수를 사용해서 남은 작업 일수를 구해줬다. 이전 코드에선 for문을 사용했음.
  • 개인적으론 다른 사람의 풀이 최상단에 있는 코드보단 이게 더 직관적이어서 이해가 쉬웠다. 초짜라서 그런가?

정리

암튼 이렇게 다양한 방법으로 문제를 풀어봤다.
나에게 필요한 것은 일차원적으로 생각하지 말고 좀더 창의적인 방법을 생각해내는 것이다.

  1. reversed는 list를 반환하는게 아닌 reversed 객체를 반환한다. map도 마찬가지로 map 객체를 반환하기 때문에 둘 다 list로 바꿔주는 부분이 필요하다.
  2. IndexError가 고려되는 부분이 있다면 try, except 방식을 사용할 수 있겠다.
  3. map(함수, 인자로 들어갈 값) 여기서 함수에 lambda가 들어가는 경우가 있다. lambda는 lambda x: ~~~ 형식

0개의 댓글