문제 설명
각 기능은 진도가 100%일 때 서비스에 반영된다. 각 기능의 개발 속도는 다르고, 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있다.
뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포된다.
따라서 주어진 각 기능의 진도율과 개발 속도에 따라 배포될 때마다 몇 개의 기능이 배포되는지 구하는 문제였다.
배포는 매일 이루어지며, 각 기능의 배포 가능일을 구한 뒤 그에 따라 기능을 배포해야 한다는 점에서 큐나 배열을 활용해야 했다.
먼저 각 기능이 완료되는 날짜를 계산하고, 그 날짜를 기준으로 몇 개의 기능이 한 번에 배포되는지를 체크하는 방식으로 접근했다.
초반에는 각 작업의 완료 날짜를 계산한 뒤, 이를 기준으로 배포 가능한 작업들을 묶어서 처리했는데, 이때 배포 작업을 한 번에 묶어주어야 하는 부분에서 약간의 고민이 있었다.
나의 풀이
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 각 작업의 배포 가능일을 구함
Queue answer = new ArrayDeque<>();
// 작업 갯수
int n = progresses.length;
// 각 작업의 배포 가능일을 저장할 배열
int[] daysLeft = new int[n];
for(int i = 0; i < n; i++) {
daysLeft[i] = (int)Math.ceil((100.0 - progresses[i]) / speeds[i]);
}
// 배포될 작업 수
int count = 0;
// 기준 배포일
int maxDay = daysLeft[0];
for(int i = 0; i < n; i++) {
// 기준 배포일과 같거나 빠른 작업들은 같이 배포할 것이므로 count 1 증가
if(daysLeft[i] <= maxDay) {
count++;
} else {
// 같이 배포할 작업들의 수를 deque에 추가
answer.add(count);
// 다시 count를 1로 초기화
count = 1;
// 가장 늦게 배포될 새로운 작업이 maxDay로 설정됨
maxDay = daysLeft[i];
}
}
// 반복문을 나오기 직전에 count한 값은 answer에 추가되지 않았으므로, 바깥에서 추가해줘야 함
answer.add(count);
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
문제를 처음 봤을 때, 각 작업의 배포 날짜를 구하는 부분은 크게 어렵지 않다고 생각했었다.
그런데 배포가 한 번에 여러 개가 될 수 있다는 점을 놓쳐서 코드가 제대로 동작하지 않았다.
배포된 날짜가 같은 작업들이 여러 개 나올 수 있기 때문에, 그들을 묶어서 한 번에 처리해주는 로직을 추가하는 부분에서 조금 헤맸다.
특히 maxDay와 count를 적절히 갱신하는 부분에서 생각보다 조금 시간이 걸렸다.
이 문제는 반복문 안에서 기준 날짜를 설정하고, 그에 맞춰 배포 가능한 작업들을 묶는 방식으로 해결할 수 있다는 걸 배웠다.
추후 비슷한 문제에서는 배포 순서를 계산할 때, 그룹으로 묶어서 처리하는 방식이 유용할 것 같다.
댓글
댓글 작성은 로그인 후에 가능합니다.