문제풀이/프로그래머스

[JAVA , Lv2] 기능개발

PhoB 2023. 2. 16. 23:29

[문제]

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

 

프로그래머스

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

programmers.co.kr


[제한 사항]

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

[내 풀이]

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        Queue<Integer> q = new LinkedList<>();
        ArrayList<Integer> al = new ArrayList<>() , speed = new ArrayList<>();
        
        for(int i : progresses){
            q.offer(i);
        }
        for(int i : speeds){
            speed.add(i);
        }
        
        while(!q.isEmpty()){
            int cnt = 0;
            for(int i=0; i<q.size(); i++){
                if(q.peek()>=100) q.offer(q.poll());
                else q.offer(q.poll()+speed.get(i));
            }//진도율 더해서 큐에 넣기
            while(!q.isEmpty() && q.peek()>=100){
                cnt++;
                q.poll();
                speed.remove(0);
            }
            if(cnt>0)al.add(cnt);
        }
 
        
        //ArrayList to int[]
        return al.stream().mapToInt(i -> i).toArray();
    }
}

[설명]

배열로 해서 푸는방법이 있고 큐(Queue)를 사용해서 푸는 방법이 있다.

나는 큐(Queue)를 사용해서 풀었는데 처음 구현한 코드는 아래와 같다.

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        Queue<Integer> q = new LinkedList<>();
        ArrayList<Integer> al = new ArrayList<>();
        
        for(int i : progresses){
            q.offer(i);
        }
        
        while(!q.isEmpty()){
            int cnt = 0;
            for(int i=0; i<q.size(); i++){
                if(q.peek()>=100) q.offer(q.poll());
                else q.offer(q.poll()+speed[i]);
            }//진도율 더해서 큐에 넣기
            while(!q.isEmpty() && q.peek()>=100){
                cnt++;
                q.poll();
            }
            if(cnt>0)al.add(cnt);
        }
        
        //ArrayList to int[]
        return al.stream().mapToInt(i -> i).toArray();
    }
}

이 코드는 진행률을 더하는 부분을 주어진 배열 speeds[]를 사용해서 넣었다.

하지만 이 코드는 하루치 작업이 끝나고 배포할 갯수를 결정하는 반복문에서 q.poll()을 통해서 큐에서만 빠지기 때문이다.

이렇게되면

progresses = [90, 80, 95, 89, 60, 75, 80] , speeds = [10, 5, 1, 5, 10, 10, 10]일때 하루가 지나면

progresses = [100, 85, 96, 94, 70, 85, 90] , speeds = [10, 5,1, 5, 10, 10, 10] 이상태가 된다. 이후 개발이 완료된 프로젝트를 제거하면

 

progresses = [85, 96, 94, 70, 85, 90] , speeds = [10, 5,1, 5, 10, 10, 10]이렇게 된다. 즉, progresses와 speeds 둘다 줄어들어야 하는데 progresses만 줄어드는 상태가 된다.

 

따라서 이 부분을 해결하기 위해 ArrayList에 speeds를 넣어서 해결해주었다.

개발이 완료된 프로젝트를 제거할 때 speeds의 맨 앞 요소를 같이 제거해준 것이다.