1 minute read



문제 풀이




작성 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        // 100%까지 남은 작업일수를 구하여 큐에 삽입한다.
        // 1. 먼저 progresses의 각 원소마다 100에서 뺄셈한다.
        // 2. 주어진 speeds로 나눈 나머지가 없다면 몫이 남은 일수, 나머지가 0보다 크다면 하루를 더 보내어야 하기 때문에 몫+1이 남은 일수가 된다.
        Queue<Integer> q = new LinkedList<>();
        for(int i = 0; i < speeds.length; i++){
            int day = 100 - progresses[i];
            if(day % speeds[i] == 0) {
                q.offer(day/speeds[i]);
            } else {
                q.offer(day/speeds[i]+1);
            }
        }

        // 배포될 기능 개수를 담을 리스트 선언
        List<Integer> list = new ArrayList<>();
        // 날짜별 배포될 기능 개수
        int cnt = 0;        
        // 큐의 맨 앞 요소를 미리 저장, 
        int first = q.peek();

        // 1. 큐가 비어질 때까지 순회하면서 배포 카운트를 1씩 증가시킨다. 
        // 2. 이때, 큐에서 원소를 하나씩 꺼내어(now) 맨 앞 요소로 저장해놓은 first와 비교한다.
        // 3. first가 now보다 작다면 첫번째 작업 이후의 작업에서 100% 작업이 완료된 기능이 있다는 것으로 간주하여 배포 개수를 1 증가시킨다.
        while(!q.isEmpty()) {
            int now = q.poll();
            if(first < now) {
                list.add(cnt);
                cnt = 0;
                first = now;
            }
            cnt++;
        }
        // 누락된 기능 배포 개수를 리스트에 마저 담는다.
        list.add(cnt);
        int[] answer = list.stream().mapToInt(i -> i).toArray();
        return answer;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        
        // int[] progresses = new int[]{93, 30, 55};
        // int[] speeds = new int[]{1, 30, 5};
        int[] progresses = new int[]{95, 90, 99, 99, 80, 99};
        int[] speeds = new int[]{1, 1, 1, 1, 1, 1};

        sol.solution(progresses, speeds);
    }
}

회고



출처


  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.