1. 문제 설명
문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
입출력 예시
progresses speeds return
[93,30,55] | [1,30,5] | [2,1] |
입출력 예시 설명
첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
2. 풀이
1) queue FIFO 을 활용한 풀이 (통과)
def solution(progresses, speeds):
answer = []
time = 0
count = 0
while len(progresses)> 0:
if (progresses[0] + time*speeds[0]) >= 100:
progresses.pop(0)
speeds.pop(0)
count += 1
else:
if count > 0:
answer.append(count)
count = 0
time += 1
answer.append(count)
return answer
progresses = [93,30,55]
speeds = [1,30,5]
1) count, time 변수를 설정해둔다.
2) 첫번째가 100이 될때까지 loop 를 돌며 time 을 늘린다.
else --> time+=1
3) (time =7) 이 되면 첫번째 값이(93) 100이 되어 if에 따라 pop 되고 count +=1
4) 현재 time 이 7이기 때문에 두번째 값(30)도 if에 따라 pop 되고 count +=1
5) 세번째 값은 100이 안되기 때문에 loop를 돌며 time 을 늘리는데
2) 번과 달리 그전에 완성된 친구들 count 값이 있기 때문에 이 친구들을 출시해줘야함
따라서 answer 리스트에 append하고 count 초기화!!!
그후에 loop를 돌며 time 을 늘리는데
6) 세번째 값(55)이 100을 넘으면 count +=1 하고
이 count 를 다시한번 answer 리스트에 append 해줌으로써 마지막 제품까지 출시 !
2) 소요 시간을 미리 계산해두기 math.ceil 을 활용해서
import math
def solution(progresses, speeds):
progresses = [math.ceil((100 - a) / b) for a, b in zip(progresses, speeds)]
answer = []
front = 0, 0
for idx in range(len(progresses)):
if progresses[idx] > progresses[front]:
answer.append(idx - front)
front = idx
answer.append(len(progresses) - front)
return answer
1) math.ceil 을 활용해서 소요시간을 각각 구한다.
math.ceil 은 소수점 올림 +)math.floor 내림, round는 반올림
주어진 조건에서 계산하면 progresses = [7,3,9]
2) progresses 의 각 소요시간을 확인하는데 이때 front 에 가장 오래걸린 소요 시간의 인덱스를 저장해둔다.
우선 초기값으론 0인덱스
3) idx = 0 : 첫번째 수(7) 보다 첫번째 수 (7) 는 같기 때문에 pass ==> front = 0
4) idx = 1 : 첫번째 수(7) 보다 두번째 수(3) 는 작기 때문에 pass ==> front = 0
5) idx = 2 : 첫번째 수(7) 보다 세번째 수(9) 는 크기 때문에
- 현재 인덱스부터 프론트인덱스의 차를 구하고 이를 answer에 append (그 전까지 친구들은 동시 출시니까)
- 프론트인덱스를 현재인덱스로 업데이트! ==> front = 2
---- 반복문 완료 ---
6) 맨 마지막에 현재 프론트인덱스와 전체 길이의 차를 구해서 남은 친구들 다 출시
3. 정리
1) 모든 풀이 과정을 다 리스트에 담아두는 방식으로 접근하지 x --> 원하는대로 구현이 안되기 쉽상.
2) 입출력 순서에 대한 언급이 있다면, stack , queue 이라 간파하고 pop 으로 풀려고 해보기
stack 의 경우에는 별도의 리스트 만들고 (stack_list)
반복하며 stack_list.pop() 으로 접근하면 쉽게 풀림 ex) () {} 문제들.
queue 의 경우는 pop(0)
'Study > Algorithm & Data structure' 카테고리의 다른 글
[프로그래머스][heap] 힙 정렬(heap sort) 개념 + 더 맵게 python (200722) (0) | 2020.07.25 |
---|---|
[프로그래머스][stack/queue] 주식가격 python (200722) (0) | 2020.07.22 |
[프로그래머스][stack/queue] 프린터 python (200719) (0) | 2020.07.19 |
[프로그래머스][stack/queue] 다리를 지나는 트럭 python (200717) (0) | 2020.07.17 |
[프로그래머스][hash] 전화번호목록 python (200715) (0) | 2020.07.15 |
댓글