문제 내용은 현재 진행된 퍼센트를 나타내는 progresses 배열과 일별 진행되는 speeds 배열을 받아 왼쪽부터 100에 도달하면 해당 일자에 완료된 갯수를 합쳐서 배열에 담아놓은 뒤 progresses 배열이 다 진행되고 나면 return 시켜주면 되는데, 주의할 점은 progresses 배열의 0번 인덱스가 완료됐으면, 1,2,3 번 인덱스도 100이 넘을 경우 한번에 뽑아낼 수 있지만
0번 인덱스가 완료됐지만, 1번 인덱스가 완료되지 못했을 경우, 2,3번 인덱스는 완료됐다 하더라도 빼낼 수 없다.
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class FunctionDevelop {
public static int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
Queue<Integer> queue = new ArrayDeque<>();
LinkedList<Integer> completedList = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
queue.add(i);
}
int day = 1;
while (!queue.isEmpty()) {
int count = 0;
if (progresses[queue.peek()] + (speeds[queue.peek()] * day) >= 100) {
queue.poll();
count++;
while (true) {
if (!queue.isEmpty()) {
if (progresses[queue.peek()] + (speeds[queue.peek()] * day) >= 100) {
queue.poll();
count++;
} else {
break;
}
} else {
break;
}
}
completedList.add(count);
}
day++;
}
return completedList.stream().mapToInt(Integer::intValue).toArray();
}
public static void main(String[] args) {
int[] pro = {95, 90, 99, 99, 80, 99};
int[] speeds = {1, 1, 1, 1, 1, 1};
System.out.println(Arrays.toString(solution(pro, speeds)));
}
}
문제를 풀어보자면 progresses 배열을 더하거나 하는 등으로 변형시키면 로직이 많이 늘어나기 때문에
Queue에 progresses 배열의 인덱스를 차례대로 넣어준 후 while문을 돌리면서 진행시켜야 하는데
Queue에 progresses 배열의 인덱스를 넣어놓고, 하루가 지날 때마다 speeds 배열의 같은 인덱스를 꺼내와서 일별 변수와 곱한 값을 progresses 배열의 인덱스와 더해본 뒤 100 미만이라면 day를 늘려 나가야 하지만, 100 이상이라면 queue 에서 하나 빼고 다음 queue를 가지고 또 계산을 해본 뒤 100 이상이라면 queue에서 또 빼주고 횟수를 더하다가, 막히는 인덱스가 있으면 list에 해당 day에 queue에서 뺀 횟수를 넣어주면 된다.
이후 day를 늘려나가면서 list에 queue에서 빠진 횟수들을 모두 더해준 후 While문이 끝나면 list를 int[] 배열 형태로 바꿔서 반환하면 끝이다.
Leave a Reply