Cohe

기능개발 본문

개발 이모저모/코딩 테스트 공부

기능개발

코헤0121 2024. 3. 29. 18:24
728x90

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항
작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력 예 설명

  1. 입출력 예 #1
    • 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다. 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다. 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
    • 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
  2. 입출력 예 #2
    • 모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.
    • 따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.

문제 풀기

  • 우선 나는.. 문제 설명부터 이해가 너무 안되었다. ㅠ 그래서 chat gpt에게 설명을 부탁했다.
  1. 작업 진도와 개발 속도가 주어진 상황이다.
  2. 첫 번째 작업부터 순차적으로 진행된다.
    1. 여기서 헷갈린게 전체 작업 진도가 증가하는지, 아니면 하나씩 순차적으로 증가하는지 이해할 수 없었다!!
    2. 그래서 다시 살펴 본 결과 전체 작업 진도가 +되는 것으로 알게 되었다  약간 이렇게...
      더보기
      Day 1: [ 93, 30, 55]
      Day 2: [ 94, 60, 60]
      Day 3: [ 95, 90, 65]
      Day 4: [ 96, 90, 70]
      Day 5: [ 97, 90, 75]
      Day 6: [ 98, 90, 80]
      Day 7: [ 99, 90, 85]
      Day 8: [100, 90, 90]
      Day 9: [100, 90, 95]
      Day 10:[100, 90,100]
  3. 그래서 진도가 100%가 되는 날짜에 해당 작업이 완료되며, 배포 일정이 결정된다! 
    더보기
    Day 1: [  O  ]
    Day 2: [  O  ]
    Day 3: [  O  O ]
    Day 4: [     O ]
    Day 5: [     O ]
    Day 6: [     O ]
    Day 7: [     O ]
    Day 8: [     O ]
    Day 9: [     O ]
    Day 10:[     O ]

 

그럼 이걸 어떻게 풀어봐야 할까..?

스택으로 풀어보기

 

  • 진도에 따른 남은 일수 계산 : 각 작업의 진도와 개발 속도를 이용하여 각 작업이 완료되기까지 남은 일수를 계산
 # 1. 진도에 따른 남은 일수 계산
    for progress, speed in zip(progresses, speeds):
        days = (100 - progress) // speed  # 남은 일수 계산
        if (100 - progress) % speed != 0:
            days += 1
        days_left.append(days)  # 계산된 남은 일수를 리스트에 추가
  • 배포 일정 확인 : 계산된 남은 일수를 이용하여 각 배포마다 몇 개의 작업이 함께 배포되는지 확인합니다.
#배포 일정 확인
while days_left:
	count = 1;
    first_day = days_left.pop(0) # 첫 번째 작업의 남은 일수
    
    # 남은 작업들 중 첫 번째 작업보다 먼저 완료되는 작업 확인
    while days_left and days.left[0] <=first_day:
    	days_left.pop(0)
        count+=1
    answer.append(count) #함께 배포되는 작업 수를 결과 리스트에 추가
  • 결과 반환 : 각 배포마다 함께 배포되는 작업의 수를 리스트에 저장하여 반환합니다
def solution(progresses, speeds):
    answer = []
    days_left=[]
    
    for p,s in zip(progresses, speeds):
        days = (100-p)//s
        if(100-p)%s !=0: 
            days+=1
        days_left.append(days)
    while days_left:
        count = 1
        first_day = days_left.pop(0)
        while days_left and days_left[0]<=first_day:
            first_day = days_left.pop(0)
            count+=1
        answer.append(count)
            
    return answer

근데 이거 보고도 내가 짤 수 있을까 고민이 된다..

그리고 프로그래머스에 넣는 순간!!! 정말 너무하게도 많이 틀렸다..

 

다시 확인해보니 작업 순서가 뒤에서부터 진행이 되는 경우도 고려하라고 한다...

def solution(progresses, speeds):
    answer = []
    days_left = []  # 각 작업의 남은 일수를 저장할 리스트
    
    # 1. 진도에 따른 남은 일수 계산
    for progress, speed in zip(progresses, speeds):
        days = (100 - progress) // speed  # 남은 일수 계산
        if (100 - progress) % speed != 0:
            days += 1
        days_left.append(days)  # 계산된 남은 일수를 리스트에 추가
    
    # 2. 배포 일정 확인
    while days_left:
        count = 1
        first_day = days_left.pop(0)  # 첫 번째 작업의 남은 일수
        
        # 남은 작업들 중 첫 번째 작업보다 먼저 완료되는 작업 확인
        while( days_left and days_left[0] )<= first_day: # 그 다음날 배포가 되기 때문
            days_left.pop(0)
            count += 1
        
        # 함께 배포되는 작업 수를 결과 리스트에 추가
        answer.append(count)
    
    return answer

일단.. 이렇게 해보려구 한다. 우우