알고리즘/프로그래머스

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

jimkwon 2022. 2. 11. 13:42
반응형

문제 링크

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

 

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

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

programmers.co.kr

뒤의 작업이 먼저 끝나더라도, 앞 작업이 끝나지 않으면 배포가 불가능하다는 성질 -> 큐

선입 선출의 성질을 가진 큐를 이용하여 풀기에 용이한 문제이다.

 

문제 예시

매일 각 progresses에 담긴 작업에 speeds만큼 작업량을 올려준다.

que의 맨 앞에 있는 작업량이 100이상일 때, 해당 작업을 포함하여 연달아 작업량을 완수한게 있다면 poll로 뽑아낸다.

 

ex) 7일 째 작업량은 [100, 240, 90] 이므로 1번 째, 두번 째 배포한 후, 2일 후 3번 째 작업을 배포한다.

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int complete;
        int days = 1;
        ArrayList<Integer> array = new ArrayList<>();
        Queue<Integer> que = new LinkedList<>();
        Queue<Integer> spd = new LinkedList<>();
        
        for (int i = 0; i < progresses.length; i++)
            que.add(progresses[i]);
        for (int i = 0; i < speeds.length; i++)
            spd.add(speeds[i]);
        
        while (!que.isEmpty()) {
            complete = 0;
            if (que.peek() + spd.peek() * days  >= 100) {
                while(!que.isEmpty() && que.peek() + spd.peek() * days >= 100) {
                    complete++;
                    que.poll();
                    spd.poll();
                }
                array.add(complete);
            }
            days++;
        }
        int[] answer = new int[array.size()];
        for (int i = 0; i < array.size(); i++) {
            answer[i] = array.get(i);
        }
        return answer;
    }
}

스택, 큐 문제는 1, 2단계에 기본으로 많이 나오는 문제이니 잘 숙지해두도록 하자.

어려운 문제를 푸는 것도 중요하지만, 내가 풀 수 있는 기본적 난이도의 문제를 다 맞추는것도 중요하니까!