문제

https://programmers.co.kr/learn/courses/30/lessons/42586?language=java

풀이

가장 앞에 들어있는 요소를 이용해야하므로, 큐를 이용해 접근해야한다.

  • ((100 - 진행량) / 작업속도)의 올림 값(남은일)을 구한다.
  • 큐가 비어있지 않고, 큐의 가장 앞의 값보다 방금 구한 값이 더 클 경우!
    1. 큐의 길이를 답변 리스트에 기록한다.
    2. 큐를 비운다.
  • 이후 큐에 다시 삽입한다.
  • 반복문이 끝나면 마지막으로 큐의 길이를 답변 리스트에 기록한다.
  • 답변 리스트를 int형 배열로 변환해서 반환한다.
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> queue = new LinkedList<>();
        List<Integer> alist = new ArrayList<>();
        
        for(int i = 0; i < progresses.length; i++){
            // 남은 작업일 수 구하기
            int devDays = (int)Math.ceil((100-progresses[i])/(double)speeds[i]);
            // 큐가 비어있지 않고, 큐의 가장 앞의 작업일이 현재 구한 작업일보다 작을 경우!
            if(!queue.isEmpty() && queue.peek() < devDays){
                alist.add(queue.size());    // 큐 길이 저장.
                queue.clear();              // 큐 비우기.
            }
            // 큐에 현재 구한 작업일 삽입.
            queue.add(devDays);
        }
        // 마지막 큐의 길이 저장.
        alist.add(queue.size());
        // 정답 리스트 int형 배열로 변환
        int[] answer = new int[alist.size()];
        int size = 0;
        for(int a : alist) answer[size++] = a;
        return answer;
    }
}

댓글남기기