본문 바로가기

코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.2 기능개발

알고리즘 고득점 kit - 스택/큐 - lv 2

 

문제 분석

  • 기능 개선 작업중 : 각 기능은 진도가 100%일 때 서비스에 반영 가능
  • 각 기능 개발 속도는 모두 다르기 때문에
  • 뒤에 있는 기능이 앞의 기능보다 먼저 개발될 수 있고,
  • 이때 뒤의 기능이 먼저 개발되면 앞의 기능이 배포될 때 함께 배포
  • 먼저 배포되어야하는 순서대로 작업의 진도가 적힌 정수 배열 progresses
  • 각 작업의 개발 속도가 적힌 정수 배열 speeds
  • 각 배포마다 몇 개의 기능이 배포되는지 return
  • 배포는 하루에 한 번
  • 배포는 하루의 끝에 이루어짐

 

코드 설계

  • 반복문을 돌면서 언제까지? : progresses 배열이 빌 때까지
  • 한 번의 반복문 == 하루
  • progresses [0] 이 100 이상인지 확인
  • 100이 넘지 않는다면 각 배열의 값은 같은 인덱스의 speeds의 값이 더해짐 
  • 100이 넘는다면 100이 넘지 않는 값이 나올 때 까지 맨 앞의 갚을 계속 popleft
  • 해당 반복문에서 popleft 되는 값의 갯수(i)만큼 answer.append(i)
  • progresses의 없어진 배열 수 만큼 speeds 배열 수도 제거

 

정답 코드

실패..

def solution(progresses, speeds):
    answer = []
    global cnt
    while progresses :
        if progresses[0] < 100 : # 맨 앞의 값이 100을 넘지 않는다면
            if cnt != 0 :
                answer.append(cnt)
            cnt = 0
            for i in range(len(progresses)):
                progresses[i] += speeds[i]
        else : # 맨 앞의 값이 100을 넘는다면
            progresses.popleft()
            speeds.popleft()
            cnt += 1
    return answer

 

다른 사람 코드 1

def solution(progresses, speeds):
    answer = []
    days = 0
    cnt = 0
    while progresses :
        # 진행상황과 그 동안 지난 날짜 만큼 speed를 구해서 더하기
        if (progresses[0] + days * speeds[0]) >= 100 :
            progresses.pop(0)
            speeds.pop(0)
            # 완료된 기능 수
            cnt += 1
        else :
            # 맨 앞이 100이 아닌데 완료된 기능이 있다면
            # 앞에서 완료되어 빠져나간 상태라면
            # answer에 더해주고 cnt = 0 초기화
            if cnt > 0 :
                answer.append(cnt)
                cnt = 0
            # 완료된 기능이 없다면 days + 1
            else :
                days += 1
    answer.append(cnt)
    return answer

 

다른 사람 코드 2

def solution(progresses, speeds):
    answer = []
    while progresses :
        cnt = 0
        
        while progresses and progresses[0] >= 100 : 
            cnt += 1
            progresses.pop(0)
            speeds.pop(0)
        
        # 작업 리스트의 진도 증가
        progresses = [progresses[i] + speeds[i] for i in range(len(progresses))]
        
        # 만약 오늘 기능이 배포되었다면 결과 리스트에 추가
        if cnt : 
            answer.append(cnt)
            
    return answer

 

2회차 - 2024.11.26

문제 분석

  • 진도가 100% 일 때 서비스에 반영
  • 뒤에 있는 기능이 먼저 개발될 수 있지만, 앞에 있는 기능이 배포될 때 함께 배포
  • progresses : 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열
  • speeds : 각 작업의 개발 속도가 적힌 정수 배열
  • 각 배포마다 몇 개의 기능이 배포되는지 return
  • 조건
    • 배포는 하루에 한 번 하루의 끝

 

코드 설계

  • speeds 값 만큼 다 더하고 나서 배포까지 하고 나면 day+1
  • speeds만큼 값 다 더하고, 
  • progress 맨 앞 값이 100 이상인지 확인
  • 큐 : 앞에서 부터 100 이상이면 하나씩 빠짐(큐) → 빠진 갯수만큼 해당 날에 배포된 작업 수
  • 배포되면 progresses에서 제거된 수만큼 & speed도 제거
  • progresses에 아무 값도 남지 않으면 끝 return

 

정답 코드 

실패 22..

from collections import deque

def solution(progresses, speeds):
    answer = []
    pro = deque()
    for i in progresses :
        pro.append(i)
    
    while pro :
        distribution = 0
        for i in range(len(pro)) :
            pro[i] += speeds[i]
        
        if pro[0] >= 100 : # while
            pro.popleft()
            del speeds[0]
            distribution += 1
        
        if not distribution == 0 :
            answer.append(distribution)
            
    return answer
  • 맨 앞부터 100 이상이면 빠지는 부분 구현 실패..
  • if pro[0] >= 100 부분을 while로 수정하면 될거같은데 "IndexError: deque index out of range"

 

 

3회차 - 25.03.26

문제 분석

  • 각 기능은 진도가 100%일 때 서비스에 반영할 수 있다.
  • 각 기능 속도는 모두 다르기 때문에 뒤에 있는 기능이 먼저 100%가 된다면 먼저 개발될 수 있으나 앞의 있는 기능보다 먼저 배포될 수는 없다.
  • progresses : 배포 순서대로 작업의 진도가 적힌 정수 배열
  • speeds : 각 작업의 개발 속도가 적힌 정수 배열
  • 각 배포마다 몇 개의 기능이 배포되는지 return

 

풀이

  • progress는 앞이 빠져야 뒤가 빠질 수 있기 때문에 큐 자료구조라고 볼 수 있다.
  • 개발이 완료되어 빠져나가면 해당 인덱스의 speed도 같이 사라져야 한다.

 

코드 설계

  • 맨 앞 기능이 완성될 때까지의 날짜

 

정답 코드

해설 코드

def solution(progresses, speeds):
    answer = []
    day = 0
    # 맨 앞의 기능이 완성될때 까지의 날짜?
    while progresses: #구현 기능이 남아 있다면
        # 날짜계산
        while progresses[0] + (day * speeds[0]) < 100:
            day += 1
        # 맨 앞 기능이 구현됨
        progresses.pop(0) # 삭제
        speeds.pop(0) # 삭제
        answer.append(1)
        
        # 이전 기능이 완료됨과 동시에 뒤에 있는 기능도 완료된다면
        while progresses and progresses[0] + (day * speeds[0]) >= 100:
            # 이후 기능이 구현된다면
            answer[-1] += 1
            # 이후 기능이 구현되면 삭제
            progresses.pop(0)
            speeds.pop(0)
        
    return answer

 

내 코드

def solution(progresses, speeds):
    answer = []
    days = 0
    cnt = 0
    
    while progresses :
		# 배포할 수 있는 것들 다 확인        
        while progresses and (progresses[0] + days * speeds[0]) >= 100 :
            if len(progresses) == 0 :
                break
            print(progresses[0] + days * speeds[0])
            cnt += 1
            progresses.pop(0)
            speeds.pop(0)
        
        # 배포된게 있으면
        if cnt > 0 :
            answer.append(cnt)
            cnt = 0
        
        # 없으면 하루만 지남
        else : 
            days += 1
            
    # answer.append(cnt) # 맨 마지막
    
    return answer