class Solution {
public static int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
for (int i = 0; i < progresses.length; i++) {
progresses[i] = ((100 - progresses[i]) % speeds[i] == 0) ? (100 - progresses[i]) / speeds[i] : (100 - progresses[i]) / speeds[i] + 1;
}
int cnt = 0;
for (int i = 0; i < progresses.length; i++) {
if (progresses[i] == 0) continue;
cnt++;
for (int j = i + 1; j < progresses.length; j++) {
if (progresses[j] < progresses[i]) progresses[j] = 0;
else progresses[j] -= progresses[i];
}
progresses[i] = 0;
for (int j = i; j < progresses.length; j++) {
if (progresses[j] > 0) break;
progresses[i]++;
}
}
answer = new int[cnt];
cnt = 0;
for (int i = 0; i < progresses.length; i++) {
if (progresses[i] > 0) answer[cnt++] = progresses[i];
}
return answer;
}
}
✏️
class Solution {
public static int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
// 각각 작업 소요 기간으로 덮어쓰기
for (int i = 0; i < progresses.length; i++) {
// 100 - progresses[i] = 100% - 작업_진행_진도율
// (100 - progresses[i]) % speeds[i] = n.n일을 찾기 위함! n.n일이면 +1
progresses[i] = ((100 - progresses[i]) % speeds[i] == 0) ? (100 - progresses[i]) / speeds[i] : (100 - progresses[i]) / speeds[i] + 1;
}
// 배포되는 날짜 카운팅
int cnt = 0;
for (int i = 0; i < progresses.length; i++) {
// (progresses[i] == 0)이면 배포할게 없는 작업(이미 배포됨)
if (progresses[i] == 0) continue;
// 위에 if문을 지나서 여기로 온거면 배포할게 있는날로, cnt += 1
cnt++;
// j는 i+1부터 마지막작업일까지 체크
// 왜냐하면 0 ~ i-1 까지는 이미 배포 확인된 작업이고
// i는 남은 작업일의 작업완료일을 계산해야하기 때문에,
// 이번 for문에서 함께 계산해버리면 뒷부분을 계산할 수 없다. 그래서 j = i + 1
for (int j = i + 1; j < progresses.length; j++) {
// j 작업의 완료일이 i작업의 완료일보다 적으면
// i 작업의 배포가 완료될때 함께 완료될수있으므로 0 줌
if (progresses[j] < progresses[i]) progresses[j] = 0;
else progresses[j] -= progresses[i];
// else 면 j 작업의 완료 소요일이 i 작업보다 긴것으로,
// j 작업 소요일수에서 i작업 소요일수를 빼줌
// 왜냐하면 모든 작업은 큐가 돌아가는날 다같이 카운팅되니깐!
}
// i일이 배포되는동안 나머지 작업의 배포 상태 계산을 완료한 상태이기때문에
// i일도 0 줌
progresses[i] = 0;
// 아래 for문은 i가 배포완료된 날 함께 완료된 다른 작업물의 수량을 세기 위함
// 해당 작업인 i가 이미 0으로 초기화 되었기 때문에,
// for문은 i부터 작업이 아직 안끝난(j > 0) 것을 만날때까지 +1 해줌
for (int j = i; j < progresses.length; j++) {
if (progresses[j] > 0) break;
progresses[i]++;
}
}
// 아래는 결과를 담을 answer 배열을 만들고 값을 옮기는 작업
answer = new int[cnt];
cnt = 0;
for (int i = 0; i < progresses.length; i++) {
if (progresses[i] > 0) answer[cnt++] = progresses[i];
}
return answer;
}
}
💪