be_better

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

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

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

NiceTry 2023. 8. 8. 23:57

목차

    💎 문제 링크

    https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=java 

     

    프로그래머스

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

    programmers.co.kr

     

    📝 문제

     

    ✍🏻 입력 & 출력

     

    🤔 풀기 전에 생각하기

    각 기능마다 speed가 다르기 때문에 남은 일 수를 먼저 계산하고 다음을 생각하는게 편할 것 같았다.
    (100 - progresses[i]) / speeds[i];​


    queue에 남은 일 수를 순서대로 저장하고
    다음 기능의 남은 일 수가 그 전 남은 일 수 보다 작으면 다음기능이 먼저 끝나는 것이기 때문에
    앞의 기능이 배포될 때 같이 배포될 수 있게 된다.

    제일 앞의 기능의 남은 일 수보다 큰 수가 나올 때 까지 같이 배포되는 기능이기 때문에

    int count = 1;

    을 선언해서 배열이나 ArrayList에 추가시켜준다.

     

    ✨ 풀이

    import java.util.ArrayList;
    import java.util.LinkedList;
    
    public class Solution {
        public int[] solution(int[] progresses, int[] speeds) {
            ArrayList<Integer> answer = new ArrayList<>();
            LinkedList<Integer> deque = new LinkedList<>();
    
            for (int i = 0; i < progresses.length; i++) {
                // 모든 큐를 돌면서, 남은 일수를 갱신해야 함
                int days = (100 - progresses[i]) / speeds[i]; // 100에서 현재 진행 일수를 빼고 스피드를 나누면 남은 일 수가 나옴
                if ((100 - progresses[i]) % speeds[i] > 0) {
                    days += 1; // int 계산이기 때문에 나머지가 발생했을 때 하루 더 증가시켜준다.
                }
                deque.offer(days); // 남은 일수를 큐에 저장
            }
    
            while (!deque.isEmpty()) {
                int currentValue = deque.poll(); // 제일 앞 처음 배포되는 기능 저장
                int count = 1; // 1일부터 시작해서 증가
    
                while (!deque.isEmpty() && currentValue >= deque.peek()) { 
                    /*
                     * peek, poll 에러 방지를 위해 empty체크
                     * 다음에 나올 남은 일수가 더 작으면 같이 배포되는 기능
                     */
                    deque.poll(); // 같이 배포되는 기능이기 때문에 poll 해서 없애버린다.
                    count++; // 대신 같이 배포된다는 count는 증가
                }
    
                answer.add(count); // 남은 일 수가 더 크다면 다음날에 배포되는 기능이기 때문에 while문을 빠져나오고 list에 count값 추가
            }
    
            return answer.stream().mapToInt(i -> i).toArray();
        }
    }