Algorithms

[프로그래머스] 연습문제 - 기능개발

Sara.H 2020. 11. 30. 18:47

programmers.co.kr/learn/courses/30/lessons/42586

 

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

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

programmers.co.kr

문제 이해하기

- 기능은 진도가 100%일 때 서비스에 반영할 수 있다.

- 각 기능의 개발속도는 다르다. 앞의 기능과 뒤의 기능의 완성 시점이 다름.

- 먼저 배포되어야 하는 순서대로 progresses 라는 배열에 담겨져서 작업이 주어짐. 배열에 담긴 숫자는 작업의 진도.

- 작업 개발 속도는 speeds 라는 배열에 담겨져서 주어짐.

- 몇 개의 기능이 배포되는지 return 하도록 한다.

 

 ex. progresses = [93, 30, 55] speeds = [1, 30, 5] /// return [2, 1]

1) 93% - 속도 1 - 1 * 7일 만큼 작업 필요

2) 30% - 속도 30 - 30 * 3일 만큼 작업 필요

3) 55% - 속도 5 - 5 * 9일 만큼 작업 필요

 

7일째 2개 기능 배포, 9일째 1개 기능 배포됨 [2, 1]

(2번째로 완성되는 기능은 1번째로 완성되는 기능을 기다려야 함)

 

ex. progresses = [95, 90, 99, 99, 80, 99] speeds = [1, 1, 1, 1, 1, 1] /// return [1, 3, 2]

1) 95% - 속도1 - 1 * 5일

2) 90% - 속도1 - 1 * 10일

3) 99% - 속도1 - 1 * 1일

4) 99% - 속도1 - 1 * 1일

5) 80% - 속도1 - 1 * 20일

6) 99% - 속도1 - 1 * 1일

 

5일째 1개 배포 가능. (기다릴게 없음)

10일째 3개 배포 가능. 3, 4 번째가 2번째를 기다려야 함.

20일째 2개 배포 가능. 6번째가 5번째 기다려야 함.

 

 

문제 해결방법 생각해보기

- 각 작업별로 몇일이 소요되는지 구해서 별도의 배열에 담아둔다.

- i 번째 작업이 그 다음번째 작업보다 적게 소요되는 경우 배포가 가능하다는 것.

- 만약 i번째 작업이 그 다음번째 작업보다 빨리 끝나면 잠시 i번째 작업 일수를 별도로 저장해두고계속 비교

- i번째 작업보다 오래 걸리는게 나오면 비교 대상을 해당 요소로 바꿔서 다시 비교.

 

소스코드

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Progress1 {

    public static void main(String[] args) {
        int [] p = {95, 90, 99, 99, 99, 99};
        int [] s = {1, 1, 1, 1, 1, 1};
        //작업 속도는 100이하의 자연수
        System.out.println("\n\n" + Arrays.toString(solution(p, s)));
    }

    public static int[] solution(int[] progresses, int[] speeds) {
        int [] answer;
        int len = progresses.length;
        answer = new int[len];

        if(len == 1){
            answer = new int[]{1};
            return answer;
        }

        Queue<Integer> queue = new LinkedList<>();
        int idx = 0;
        
        for (int i = 0; i < progresses.length; i++) {
            int p = progresses[i];
            int s = speeds[i];

            //현재 작업일 cur
            int cur = (int) Math.ceil(((double)100 - p) / s);

            if(queue.peek() != null){
                int top = queue.peek();
                answer[idx] += 1;
                if(top < cur){
                    answer[idx] = queue.size();
                    queue.clear();
                    idx++;
                }
            }
            queue.offer(cur);

            System.out.println(queue);
        }

        answer[idx] = queue.size();

        return Arrays.copyOfRange(answer, 0, idx + 1);
    }
}

> 큐의 사이즈를 answer 에다가 넣고 싶은데, 가장 마지막 요소가 큐에 넣어지고 for 문이 종료되기 때문에, 해당 요소에 대한 answer 값을 업데이트 할 수 가 없었다... 그래서 땜빵식으로 for문의 밖으로 나왔을 때 마지막 idx 에다가 queue 의 사이즈를 할당하였는데, 너무 이상한듯 ...

 

✨ 다른 사람의 풀이