프로그래머스 Lv.2 - 42586 기능개발
프로그래머스 Lv.2 - 42586 기능개발 문제 풀이
문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크
풀이 코드
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int count = 1, passCount = 0;
List<Integer> resultList = new ArrayList<>();
Queue<Integer> progressQueue = Arrays.stream(progresses)
.boxed()
.collect(Collectors.toCollection(LinkedList::new));
Queue<Integer> speedQueue = Arrays.stream(speeds)
.boxed()
.collect(Collectors.toCollection(LinkedList::new));
while(!progressQueue.isEmpty()) {
if((progressQueue.peek() + (speedQueue.peek() * count)) >= 100) {
passCount += 1;
progressQueue.poll();
speedQueue.poll();
} else {
if(passCount > 0)
resultList.add(passCount);
passCount = 0;
count += 1;
}
}
if(passCount > 0)
resultList.add(passCount);
return resultList.stream().mapToInt(i -> i).toArray();
}
}
문제 해결 전략
이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목
바로 떠오른 해결 방법은 progresses 배열의 0번째 요소 값이 100 미만인 경우, 100 이상이 될 때까지 반복하면서 모든 요소의 인덱스에 맞는 speeds 배열의 요소 값을 더한 후 0번째 인덱스부터 요소의 값이 100 이상인 요소를 찾아 카운트를 하여 저장하는 방식을 떠올렸고, 이를 어떻게 구현하면 좋을까 고민하기 시작
간단하게 구현한다면 while문 내부에 for문을 사용하여 위 로직을 구현하면 되겠지만.. 2중 반복문을 사용하기 싫기에 다른 방법을 고민
단일 반복을 시키되 반복된 횟수를 기록하여 계산하면 될 것 같다는 생각에 구현 시작
반복 횟수를 기록하여 speeds 값에 곱한 수치를 더하여 100이 넘는지 확인을 해야 하기에 Queue를 사용하면 편할 것 같다는 생각을 하여 progresses 배열과 speeds 배열을 둘 다 Queue로 변환
이후 progresses 큐가 빈 큐가 될 때까지 반복하면서 계산 시작
만약 위 계산에서 100을 넘기는 경우가 발생하면 연속으로 100을 넘기는 경우가 있는지 카운트
100 이상이 아닌 경우가 발생한다면 지금까지 카운트 한 숫자를 반환할 list에 저장
progresses 큐가 빈 큐가 되어 while문을 나오게 될 때, 카운트(passCount)가 0이 아니라면 해당 값도 반환할 list에 저장
최종적으로 나온 list을 stream을 통해 int 배열로 변환하여 반환하여 해결
코드를 업로드해 둔 깃 허브