🥹

아좌잣 홧팅이닷!

토독토독..💻

알고리즘🤮/프로그래머스

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

SU_VIN 2023. 2. 6. 23:09
반응형

 

 

 

프로그래머스

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

programmers.co.kr

 

 

문제 설명

 

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

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

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

제한 사항

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

입출력 예

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]

일단 나는 데이터를 작업이 끝나기까지 필요한 시간으로 계산을 해두고 풀었다

100을 채우면 일이 끝나니 100에서 progresses를 빼준후 그 값들을 speeds로 나누어주었다

 

그다음은 deque를 사용했는데 이유는 peekFirst를 사용해야 했기 때문이다


import java.util.ArrayDeque;

public class PRO_CT_20 {

    public static int[] solution(int[] progresses, int[] speeds) {
        
        int[] arr =new int[progresses.length];
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        ArrayDeque<Integer> score = new ArrayDeque<>();
        
        //데이터 계산해서 새롭게 만들기
        for(int i=0;i<progresses.length;i++){
            arr[i]=(int)Math.ceil(((double) 100-progresses[i])/(double)speeds[i]);
        }
        
        for(int i=0;i<arr.length;i++){
            if(i==0) deque.addLast(arr[i]); //처음 데이터는 무조건 넣어주고
            else{
                if(arr[i]<=deque.peekFirst()){ //peekFirst보다 값이 작다면
                    deque.addLast(arr[i]); //데큐에 계속 값을 넣어주고
                    if(i==arr.length-1)score.addLast(deque.size()); //마지막 값일때 처리

                }else{ //크다면
                    score.addLast(deque.size()); //결과를 저장하는 score에 현재 데큐의 사이즈를 넣어줌
                    deque.clear();//일이 끝났으니 클리어 해주고
                    deque.addLast(arr[i]); //현재의 값을 데큐에 넣어줌
                    if(i==arr.length-1)score.addLast(deque.size());//마지막 값일때 처리
                }
            }

        }
        
        //값을 담을 배열을 만들어주고
        int[] result =new int[score.size()];

        //하나씩 배열에 담아줌
        for(int i=0;i<result.length;i++){
            result[i]=score.pollFirst();
            System.out.println(result[i]);
        }

        return result;
    }
    public static void main(String[] args) {
        int[] progresses={95, 90, 99, 99, 80, 99};
        int[] speeds={1, 1, 1, 1,1};
        System.out.println(solution(progresses,speeds));

    }
}

마지막에 결과배열에 값을 하나씩 담아줄 때 조건문의 조건을 score.size()로 하면 안 된다 왜냐면 값을 담을 때 poll 하기 때문에

사이즈가 계속 변하기 때문!! 

거의 처음 코테풀었을때 실패했던 문제였는데 지금은 가볍게 푸는 거 보니 코테공부 헛되게 하진 않았나 보다 ㅎㅎ

통과!!

 

 

반응형