해당 알고리즘 자료는 제가 직접 푼 것도 있지만 다른 분들의 풀이과의 비교를 통해 더 나은 알고리즘을 공부하기 위해 정리한 것들입니다.
https://programmers.co.kr/learn/courses/30/lessons/42586
풀이 1. (초급) - 필요한 일자 수를 계산하여 비교
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList <Integer> list = new ArrayList<Integer>();
int cnt = 1;
int sec = secCalc(progresses[0],speeds[0]);
for (int i = 1; i < speeds.length; i++) {
if (secCalc(progresses[i], speeds[i]) <= sec) cnt++;
else {
list.add(cnt);
cnt = 1;
sec = secCalc(progresses[i], speeds[i]);
}
}
list.add(cnt);
int [] ans = new int[list.size()];
for (int i = 0; i < ans.length; i++) {
ans[i] = list.get(i);
}
return ans;
}
private static int secCalc(int i, int j) {
return (100-i)%j == 0 ? (100-i)/j : (100-i)/j + 1;
}
}
풀이 2. (중급) - 스트림의 필터를 이용
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] dayOfend = new int[100]; // 100개의 작업
int day = -1;
for(int i=0; i<progresses.length; i++) {
while(progresses[i] + (day*speeds[i]) < 100) {
day++;
}
dayOfend[day]++;
}
return Arrays.stream(dayOfend).filter(i -> i!=0).toArray();
// 전체 배열에서 0이 아닌 부분을 필터하여 배열로 변환
}
}