처음에 for문을 계속 돌리면서 진행율이 100이 되는것을 계속 체크해서 결과를 도출했으나 메모리 용량 초과라 뜨며 실패했다.
다시 규칙을 찾아보는데, 전체 진도 100에서 현재 작업진도(progresses)를 뺀 뒤 작업속도(speeds)로 나눈 몫을 이용하면 될 것 같아서 아래와 같이 소스를 짤 수 있었다.
큐를 이용하여 하나씩 꺼내면서 이전 값과 비교했을 때 작으면 이미 해당 작업은 진작에 끝난것이여서 count +1 해주면 되는 것이고, 크다면 새롭게 갯수를 새주면 된다.
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
int len = speeds.length;
for(int i=0; i<len; i++) {
int num = 100 - progresses[i]; // 진도 100과의 차이
int temp = 0;
// 며칠 걸리는지 파악
if(num % speeds[i] != 0 ){
temp = num / speeds[i] + 1;
}else {
temp = num / speeds[i];
}
q.offer(temp);
}
ArrayList<Integer> result = new ArrayList<>();
int count = 0;
// 큐에서 첫번재 요소 미리 뺌
int prev = q.poll();
count += 1;
while(!q.isEmpty()) {
int a = q.poll();
if(a <= prev) { // 이전 값보다 작으면 이미 완료된 상태니까 count + 1
count += 1;
}else { // 이전 값보다 크면 더 오래 걸린거니까 지금까지 갯수 샌거 넣고 새롭게 시작
result.add(count);
count = 1;
prev = a;
}
}
result.add(count);
int[] answer = new int[result.size()];
for(int i=0; i<result.size(); i++) {
answer[i] = result.get(i);
}
return answer;
}
}