코딩테스트 연습 > 스택/큐 > 기능개발
https://school.programmers.co.kr/learn/courses/30/lessons/42586
작업의 완료된 정도 progresses와 해당 작업을 처리할 때 속도 speeds가 주어진다. 작업의 남은 양을 계산하여 작업이 처리되는 일 수를 반환하라.

어떤 풀이를 하던 작업의 남은 일 수를 계산하는 계산식은
(100 - progress)/speed + (100-progress)%speed 한 것을 반올림한다.
import java.util.Stack;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Stack<Integer> stack = new Stack<>();
Stack<Integer> days = new Stack<>();
int remainingday;
for(int i = progresses.length-1; i>=0; i--){
remainingday = (100-progresses[i])/speeds[i];
if((100-progresses[i])%speeds[i]>0){
remainingday++;
}
stack.push(remainingday);
}
while(!stack.isEmpty()){
int day =1;
int currentMax = stack.pop();
while(!stack.isEmpty() && currentMax >=stack.peek()){
stack.pop();
day++;
}
days.push(day);
}
int[] answer = new int [days.size()];
for(int j=days.size() -1 ;j>=0;j--){
answer[j]=days.pop();
}
return answer;
}
}
import java.util.Stack;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int answer[] = new int[progresses.length];
int remain_day[] = new int[progresses.length];
int i, j,currentMax, day;
for(i = 0; i<progresses.length; i++){
remain_day[i] = (100-progresses[i])/speeds[i];
if((100-progresses[i])%speeds[i] >0 ) {
remain_day[i] += 1;
}
}
currentMax=0;
j =0;
day =1;
for(i=1; i<remain_day.length; i++){
if(remain_day[currentMax]>=remain_day[i]){
day++;
}else{
currentMax = i;
answer[j++] = day;
day = 1;
}
}
answer[j++] = day;
int result[] = new int[j];
for(i = 0; i<j; i++){
result[i] = answer[i];
}
return result;
}
}
내가 푼 2가지 방식 모두 비슷한 흐름으로 풀린다. 물론 stack에서는 시간 복잡도가 O(n^2) (이중으로 while 문 사용)했고, 배열로 풀었을 때는 시간 복잡도가O(n)이다. 더 좋은 풀이 방법이 있겠지만, 내가 생각난 방법일 뿐이다.
스택 풀이


배열 풀이

