코딩테스트/프로그래머스

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

블로그 주인장 2023. 8. 9.

 

[ 목차 ]

     


    📢 문제 출처

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr


    ⏰ 문제 설명

    • 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 
    • 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

    ⏰ 입출력 예시

    progresses speeds return
    [93, 30, 55] [1, 30, 5] [2, 1]
    [95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]
    • 입출력 예 #1
    • (1). 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.  두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
    • (2). 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
    • (3). 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
    • 입출력 예 #2
    • (1). 모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다. 
    • (2). 따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.

    ⏰ 문제 풀이 정리 (feat. 문제이해를 제대로 못해서 그림으로 정리)


    ⏰ 풀이

    import java.util.*;
    import java.util.Queue;
    
    class Solution {
        public int[] solution(int[] progresses, int[] speeds) {
    
            Queue<Integer> queue = new LinkedList();
            ArrayList<Integer> arrayList = new ArrayList<Integer>();
    
            //프로세스 남은 양
            for (int i = 0; i < speeds.length; i++) {
                int day = 0;
                while(progresses[i] + (day * speeds[i]) < 100){
                    day++;
                }
                queue.add(day);
            }
            
            int count = 0;              //카운트
            int temp = queue.peek();    //처음 큐
            while (!queue.isEmpty()){
                if(queue.peek() <= temp)
                {
                    queue.poll();
                }
                else{
                    temp = queue.poll();
                }
                count++;
    
                if(queue.isEmpty()){
                    arrayList.add(count);
                }
                else if (queue.peek() > temp) {
                    // 뒷 값이 더 큰 경우
                    arrayList.add(count);
                    count = 0;
                    temp = 0;
                }
            }
         
            int[] answer = new int[arrayList.size()];
    
            for (int i = 0; i < answer.length; i++) {
                answer[i] = arrayList.get(i);
            }
            
            return answer;
        }
    }
    • "Queue" 를 이용한 풀이를 진행한 것이다.
    • 100% 되려면 어느 정도 기간이 걸리는 지 확인하고 그 날짜를 Queue.add 진행하였다.
    • 이전에 peek 했던 데이터보다 현재 데이터가 크거나 같을 때 배포를 진행 못한 것으로 보고,
    • 반면에 peek 했던 데이터보다 현재 데이터가 작으면 배포를 완료했다고 보고 리턴을 시킨다.

    ⏰ 다른 풀이

    import java.util.*;
    
    class Solution {
        public int[] solution(int[] progresses, int[] speeds) {
            Queue<Integer> q = new LinkedList<>();
            List<Integer> answerList = new ArrayList<>();
    
            for (int i = 0; i < speeds.length; i++) {
                double remain = (100 - progresses[i]) / (double) speeds[i];
                int date = (int) Math.ceil(remain);
    
                if (!q.isEmpty() && q.peek() < date) {
                    answerList.add(q.size());
                    q.clear();
                }
    
                q.offer(date);
            }
    
            answerList.add(q.size());
    
            int[] answer = new int[answerList.size()];
    
            for (int i = 0; i < answer.length; i++) {
                answer[i] = answerList.get(i);
            }
    
            return answer;
        }
    }
    • 끝나는 날짜를 미리 예측해서 값을 넣어주는 방법이다.

     

    반응형

    댓글