알고리즘/programmers

프로그래머스 레벨2 기능 개발 (JAVA)

dev-jo 2021. 9. 8. 22:12

오랜만에 알고리즘 포스팅

 

푼건 예전에 풀었지만

 

까먹을거 같아서 올립니다!

 

코드는 GitHub 에도 올려져 있습니다!

 

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

 

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

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

programmers.co.kr

 

 

기능 개발입니다

 

2가지 방법으로 풀었는데

 

큐를쓴것과 큐를 안쓴것.

package level02;


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 *
 * 기능 개발
 *
 */
public class Programmers42586 {


    //큐사용 좀 느림..
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> integers = new ArrayList<>();

        Queue<Integer> queue = new LinkedList<>();

        for (int i = 0; i < progresses.length; i++) {
            int n = (int) Math.ceil((double) (100 - progresses[i]) / speeds[i]);
            queue.add(n);
        }

        while (!queue.isEmpty()) {

            int answer = 1;
            int x = queue.poll();

            while (!queue.isEmpty()) {
                if(queue.peek() <= x) {
                    answer++;
                    queue.poll();
                } else {
                    break;
                }
            }
            integers.add(answer);
        }


        int[] answer = new int[integers.size()];
        for(int i=0; i<answer.length; i++) {
            answer[i] = integers.get(i);
        }

        return answer;
    }

    // 큐 안쓴 방식 기본 속도 0.02
    public int[] solution2(int[] progresses, int[] speeds) {
        int[] answer = new int[100];

        int x =  (99 - progresses[0]) / speeds[0] + 1;
        int count = 1;
        int index = 0;
        for (int i = 1; i < progresses.length; i++) {
            int n = (99 - progresses[i]) / speeds[i] + 1;
            if(n <= x) {
                count++;
            } else {
                answer[index] = count;
                count = 1;
                index++;
                x = n;
            }
        }
        answer[index] = count;
        int[] result = new int[index + 1];
        for(int i=0; i<result.length; i++) {
            result[i] = answer[i];
        }
        return result;
    }

}

 

큐는 미리 걸리는 시간을 구해서 큐에 넣고

 

큐가 아닌건 매번 시간을 구하여

 

다음번째가 앞에있는것보다 걸리는 시간이 작다면 

카운트를 올리고

 

이제 앞에 큐보다 오래걸리는 기능이 온다면

 

현재까지 계산된 카운트를 추가해주고

 

다시 돌립니다.

 

즉..

 

[93, 30, 55] [1, 30, 5] [2, 1]

 

일 때

 

7 3 9 가 나옵니다

 

처음 7 이 구해졌으므로 count = 1

 

그다음 3이 7보다 작으므로 count = 2

 

그다음 9가 7보다 크니까 배열의 첫번째는 count = 2 가 들어가고

 

그다음 9가 마지막이니 1이 들억마ㅡ로

 

[2,1] 이 나오는 문제입니다..!