알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!
이 문제는 작업 완성까지 남은 일의 양을 구하고, 이를 작업 속도로 나누어 작업별 소요 일수를 구하고,
소요 일수를 하나씩 꺼내 크기를 비교하면서 한번에 릴리즈되는 기능을 count 해주는 문제이다.
입출력 예로 제시된 [95,90,99,99,80,99], [1,1,1,1,1,1]을 보자
1. 작업 완성까지 남은 일의 양 [5,10,1,1,20,1]
2. 작업별 소요 일수 [5,10,1,1,20,1]
3. 한 번에 릴리즈되는 기능 묶음 [5],[10,1,1],[20.1]
때문에 return 값은 [1,3,2]가 된다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public static int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
queue.add((int) Math.ceil((100 - progresses[i]) / (double)speeds[i]));
}
LinkedList<Integer> counts = new LinkedList<>();
int cnt = 1;
int front = queue.poll();
while(!queue.isEmpty()) {
int next = queue.poll();
if(front < next) { // 앞의 값이 뒤의 값보다 작으면 바로 끝, 다시 loop
counts.add(cnt);
cnt = 1;
front = next;
continue;
}
else { // 앞의 값이 뒤의 값보다 크면 cnt++
cnt++;
}
}
// 마지막 값 넣기
counts.add(cnt);
// LinkedList에 있던 값 answer[]으로 이동
int[] answer = new int[counts.size()];
for(int i = 0; i < counts.size(); i++) {
answer[i] = counts.get(i);
}
return answer;
}
}
바로 전에 포스팅한 [프로그래머스] 주식가격 문제와 마찬가지로 이중 for문을 통해서 값을 비교해줄 수도 있을듯한데,
이중 반복문을 사용하지 않고 Stack, Queue 등 자료구조를 활용하는 것의 장점은 무엇일까?
문제 카데고리에 연연하지 않고 해당 문제를 가장 효율적으로 푸는 방법을 고민해봐야겠다.