Cohe
기능개발 본문
728x90
반응형
문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
작업 진도는 100 미만의 자연수입니다.
작업 속도는 100 이하의 자연수입니다.
배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
입출력 예 설명
- 입출력 예 #1
- 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다. 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다. 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
- 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
- 입출력 예 #2
- 모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.
- 따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.
문제 풀기
- 우선 나는.. 문제 설명부터 이해가 너무 안되었다. ㅠ 그래서 chat gpt에게 설명을 부탁했다.
- 작업 진도와 개발 속도가 주어진 상황이다.
- 첫 번째 작업부터 순차적으로 진행된다.
- 여기서 헷갈린게 전체 작업 진도가 증가하는지, 아니면 하나씩 순차적으로 증가하는지 이해할 수 없었다!!
- 그래서 다시 살펴 본 결과 전체 작업 진도가 +되는 것으로 알게 되었다 약간 이렇게...
더보기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]
- 그래서 진도가 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
일단.. 이렇게 해보려구 한다. 우우
728x90
반응형
'개발 이모저모 > 코딩 테스트 공부' 카테고리의 다른 글
프로그래머스 명예의 전당 (1) | 2024.10.01 |
---|---|
프로그래머스 최소직사각형 (2) | 2024.09.28 |
프로그래머스 올바른 괄호, JadenCase 문자열 만들기 (0) | 2024.08.20 |