ALGORITHM/PROGRAMMERS

[프로그래머스] 기능개발

0298 2021. 7. 26. 20:54

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

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

2021-07-26


1. 배열? (not queue)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> list = new ArrayList<>();
        int prev = (int) Math.ceil((double)(100 - progresses[0]) / speeds[0]);;
        int count = 1;
        for(int i = 1; i < progresses.length; i++) {
            int tmp = (int) Math.ceil((double)(100 - progresses[i]) / speeds[i]);
            if(prev >= tmp) {
                count++;
            } else {
                prev = tmp;
                list.add(count);
                count = 1;
            }
        }
        list.add(count);
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) answer[i] = list.get(i);
        return answer;
    }
}
cs

#문제풀이

사실 위에 분류가 스택/큐로 되어 있는걸 못 보고 그냥 풀었다.

 

원리는 동일할 것이다. progresses 배열과 speeds 배열을 통해 각각 작업을 하는데 걸리는 시간을 구한다. 

이 때, 기준 작업 (prev)보다 적은 시간이 걸리는 작업들의 경우에만 한 번에 배포가 가능하다. 그래서, prev 보다 오래 걸리는 작업 시간 전까지 하나로 묶어서 생각해주면 된다.

 

 

2. Queue

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
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> q = new LinkedList<>();
        for(int i = 0; i < progresses.length; i++) {
            q.add((int)Math.ceil((double) (100 - progresses[i])/speeds[i]));
        }
        List<Integer> list = new ArrayList<>();
        if(!q.isEmpty()) {
            int prev = q.poll();
            int count = 1;
            while (!q.isEmpty()) {
                int cur = q.poll();
                if (prev >= cur) {
                    count++;
                } else {
                    list.add(count);
                    prev = cur;
                    count = 1;
                }
            }
            list.add(count);
        }
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}
cs

 

#문제풀이

글을 쓰면서 스택/큐로 분류 되었다는걸 알아서, queue를 사용해서도 한 번 풀어봤다. 

위와 같은 방식으로 풀었다.