알고리즘/Problem Solving

프로그래머스 - 기능개발

도툐리 2024. 2. 19. 23:56

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

[풀이1] 내 풀이 1

from collections import deque

def solution(progresses, speeds):
    answer = []
    
    # 먼저 배포되어야 하는 순서가 있으므로, queue를 써야함을 예상해볼 수 있다.
    work = deque()
    for num,speed in zip(progresses,speeds):
        work.append((100-num, speed)) # 잔여 진도, 해당 작업 속도 -> tuple
    
    feature_num = 0
    day = 1
    while len(work) != 0:
        left_over, speed = work[0]
        left_over -= speed*day
        if (left_over<=0): # 현재 작업 끝
            work.popleft()
            feature_num+=1
        else: # 현재 작업 아직 끝 X 
            if (feature_num>0): # 기존 작업 된거 있으면 배포 ㄱㄱ
                answer.append(feature_num)
                feature_num = 0
            day+=1
    answer.append(feature_num)
            
    return answer
  • 불필요하게 복잡해진듯한 기묘한 느낌쓰.
  • day에 따라 +가 1씩 이루어짐. 즉, 총 개발 일수만큼 loop을 돌아야함.
  • O(n)

 

[풀이2] 남의 풀이 보고 다시 발전 시켜본 내 풀이 2 (daysLeft 기반)

def solution(progresses, speeds):
    answer = []
    
    days_left = []
    for (progress, speed) in zip(progresses, speeds):
        days_left.append(ceil((100-progress)/speed))
    
    feat_cnt = 0
    while days_left:
        feat_cnt+=1
        # (1) base case
        if len(days_left)==1: 
            answer.append(feat_cnt)
        # (2) 일반 case
        elif days_left[0]<days_left[1]: # 오름차순인 경우 (배포 주기 끊김)
            answer.append(feat_cnt)
            feat_cnt=0    
        days_left.pop(0)
    
    return answer
  • 풀이 1에 비해 달라진 점 :
    • 개발 일수만큼 loop을 도는게 아니라 피처 갯수 (= len(progresses) = len(speeds) 만큼 loop을 돎

 

 


깨달음

  •