import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] temp = new int[100]; // 모두 0으로 초기화 되어 있음.
// 작업 진행 상황을 모두 배열로(0 포함)
for (int i=0;i<100;i++) {
int index=0;
int endIndex=0;
// 진도를 모두 올림
for (int j=0;j< progresses.length;j++) {
progresses[j]+=speeds[j];
}
// 올라간 진도를 비교해서...
for (int j=0;j< progresses.length;j++) {
//20000: 최대값. 진도율 100이던 작업이 속도 100으로 100일 달리면 20000이 최대임
if (progresses[j] >= 100 && progresses[j] <= 20000) {
index++;
endIndex++;
progresses[j] = 30000; // if문을 벗어나게 아예 크게 설정
} else if (progresses[j]<100) {
temp[i]=index;
break;
} else {
endIndex++;
}
if (endIndex== progresses.length) { // 모두 100 넘게 달성했을 경우
temp[i]=index;
}
}
}
// temp에서 0 제거
List<Integer> list = new ArrayList<>();
Arrays.stream(temp).forEach(a -> {
if (a!=0) {
list.add(a);
}
});
int[] answer = list.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
어려운 문제는 아니었지만, 효율적으로 풀었다고 생각이 되진 않는다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] dayOfend = new int[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();
}
}
일단 return 부분에서 0을 제외시키는게 굉장히 깔끔하다!
stream의 filter를 사용한다는 것이 항상 잊어버리는... 하하 꼭 써먹어봐야지싶다.
그리고 day라는 변수를 1씩 증가시키며, 그것으로 dayOfend 배열의 일자에 완료된 작업의 개수를 추가한다는 것 풀이를 생각할 수 있다니!
데이터 낭비도 심하지 않고 속도도 빠르다.
이런식으로 좀 더 효율적인 풀이를 고민해야겠다.