문제 설명
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100% 일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
제한 사항
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
[93, 30, 55] | [1, 30, 5] | [2, 1] |
[95, 90, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
입출력 예 #1
첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
입출력 예 #2
모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.
따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
static int finish = 0;
static int day = 1;
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q1 = new LinkedList<>();
Queue<Integer> q2 = new LinkedList<>();
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0 ; i < progresses.length; i++){
q1.offer(progresses[i]);
}
for(int i = 0 ; i < speeds.length; i++){
q2.offer(speeds[i]);
}
while(!q1.isEmpty()){
if(q1.peek() + (q2.peek() * day) >= 100){
while(!q1.isEmpty() && q1.peek() + (q2.peek() * day) >= 100){
finish++;
q1.poll();
q2.poll();
}
list.add(finish);
finish = 0;
}
day++;
}
int[] answer = new int[list.size()];
for(int i = 0 ; i < list.size();i++){
answer[i] = list.get(i);
}
return answer;
}
}
○ 문제 풀이
큐를 두 개 만들어서 progresses 와 speeds를 각각 하나의 큐에 넣어주었다.
그리고 마지막에 결과 값을 출력하기 위해 ArrayList를 하나 만들어주었다.
이 문제의 핵심은 큐를 이용하기 때문에 가장 밑에 있는 값이 빠져나가지 않으면 중간에 있는 값이 조건을 충족해도 빠져나갈 수 없다.
그러므로 가장 밑에 있는 값이 큐를 빠져나갈 때, 그 위에 있는 값을 보고 조건을 충족하는지 확인해서 내보내던지 다시 연산을 하던지 해야 한다. 그림으로 보면 무슨 말인지 한 번에 이해가 된다.
지금부터 가장 아래 값이 100이 되는 과정을 보도록 하자. 첫 번째 값의 하루 개발 속도는 1이다. 그러면 7일이 지나야 첫 번째 값은 100이 되어 큐를 빠져나갈 수 있다. 그때 두 번째 값인 30은 240이 된다. 그러면 두 번째 값도 조건을 충족하기 때문에 큐를 빠져나간다. 그래서 7일 뒤에 빠져나가는 값은 첫 번째 값과 두 번째 값이 빠져나가고 세 번째 값은 조건을 충족하기 못해서 큐에 머무르게 된다.
두 개의 값이 빠져나가기 때문에 빠져나간 데이터 값의 개수를 list에 넣어준다.
그리고 세 번째 값은 첫 번째와 두 번째 값이 빠져나가고 이틀 후에 조건을 충족해서 큐를 빠져나가게 된다. 이때 빠져나간 데이터의 개수의 값을 위와 동일하게 list에 넣어준다.
그러면 현재 list에는 {2,1}이라는 값이 들어있다. 여기서 list에 들어있는 값을 하나씩 answer 배열로 넣어주고 answer를 반환해주면 된다.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스. 체육복(JAVA) (0) | 2022.05.13 |
---|---|
프로그래머스. 크레인 인형뽑기 게임(JAVA)(스택) (0) | 2022.05.02 |
프로그래머스. 모의고사(JAVA)(완전 탐색) (0) | 2022.04.21 |
프로그래머스. 더 맵게 (JAVA)(Level 2) (0) | 2022.04.15 |
프로그래머스 [카카오 인턴] 키패드 누르기 (Level 1)(JAVA) (0) | 2022.04.13 |