[알고리즘] 프로그래머스 - 기능개발(Stack/Queue)

홍예주·2021년 5월 7일
0

알고리즘

목록 보기
2/92

1. 문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

2. 제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.


3. 풀이

  • Stack Library 사용
  • remain 스택에 작업별로 남은 날짜를 push
  • 스택에서 하나씩 꺼내서 다음 값과 비교
    -> 현재 남은 날짜가 더 크거나 같으면 다음 작업은 이전 작업이 끝날 때 까지 기다려야함
    -> answer의 현재 index 위치 값 +1
    -> 현재 남은 날짜가 더 작으면 차례대로 작업 진행 가능
    -> index+1
  • 스택 크기가 0이 되면 모든 작업 확인 끝

4. 코드

import java.util.Arrays;
import java.util.Stack;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        int length = progresses.length;
        Stack<Integer> remain = new Stack<>();
        int tmp;
        int index = 0;

        answer = new int[length];
        
        for(int i = length-1; i>=0;i--) {
        	tmp = (int)Math.ceil(((double)100-progresses[i])/speeds[i]);
        	remain.push(tmp);
        }

        for(int j = 0; j<length;j++) {
			if(remain.size()==0) {
				break;
			}
        	tmp = remain.pop();
			answer[index]++;
			for(int i = j; i<length;i++) {
				if(remain.size()==0) {
					break;
				}
				if(tmp>=remain.peek()) {
					remain.pop();
					answer[index]++;
				}
				else if(tmp<remain.peek()) {
					index++;
					break;
				}
			}
        }
        
        answer = Arrays.copyOf(answer, index+1);
        
        return answer;
    }
}
profile
기록용.

0개의 댓글