[프로그래머스 스터디] 기능 개발 - Python

MinTa·2022년 2월 17일
0
post-thumbnail

문제

프로그래머스 기능개발

풀이

from collections import deque, Counter
import math


def solution(progresses, speeds):
    days = []
    for i in range(len(progresses)):
        day = math.ceil((100 - progresses[i]) / speeds[i])
        days.append(day)

    firstTaskDay = days[0]
    for i in range(1, len(days)):
        if days[i] < firstTaskDay:
            days[i] = firstTaskDay
        else:
            firstTaskDay = days[i]
            continue

    answer = list(Counter(days).values())

    return answer

요약

  1. 각 일들이 배포까지의 몇일이 걸릴지 math.ceil 함수로 올림해주어 일수를 계산한 리스트(days)를 먼저 생성했습니다.
  2. 첫번째 기능 개발이 최우선사항이므로 첫번째 기능개발에 걸리는 일수(즉, days함수의 첫번째 요소)를 기준으로 그 다음 요소부터 days리스트를 돌며 판단합니다.
  • 첫번째 기능개발일수보다 걸리는 일수가 작을 경우

    해당 일수를 첫번째 기능 개발일수로 초기화해줍니다 ( 어차피 첫번째 기능이 배포되는 일수에 배포될 것이기 때문.)
  • 첫번째 기능개발일수보다 걸리는 일수가 같거나 클 경우

    이 경우에는 순서대로 배포가 진행될 수 있기 때문에 판단기준을 해당 기능개발일수로 옮겨주고 continue로 다음 기능개발로 넘어갑니다.
  1. Counter 함수를 사용해보았습니다. Counter 함수를 통해 같은 날로 초기화해준날과 다른날들의 개수를 얻은 list를 얻고, values()함수를 통해 값들을 받아서 return해줍니다.

피드백을 받고 개선된 풀이

from collections import deque, Counter
import math


def solution(progresses, speeds):
    days = []
    for p, s in zip(progresses, speeds):
        day = math.ceil((100 - p) / s)
        days.append(day)

    first_task_day = days[0]
    for i in range(1, len(days)):
        if days[i] < first_task_day:
            days[i] = first_task_day
        else:
            first_task_day = days[i]


    answer = list(Counter(days).values())

    return answer
  • 같은 인덱스를 묶는 것으로 zip함수를 활용해서 보기에 깔끔한 코드로 변경.
  • PEP8 스타일 가이드에 맞춰 camelCase가 아닌 snake_case로 변수명 변경
  • 두번째 for문 안에 있던 continue를 제거함으로써 불필요한 코드를 삭제
    위 3가지를 수정함으로써 더욱 더 파이써닉하고 간결한 코드를 작성할 수 있었다.

...

이전 풀이
예~전에 풀고 게시물이 남긴적이 있어서 깜짝 놀랐다. 풀어봤던 문제다 싶긴 했는데 이땐 제대로 온전히 내 힘으로 풀지 않았었나 보다. 이전 게시물보다 훨씬 깔끔하게 푼 것 같아서 그부분은 기분이 좋다.

profile
지(치지않고)꾸(준히)열(심히)

0개의 댓글