[ 목차 ]
📢 문제 출처
⏰ 문제 설명
- 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
- 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
⏰ 입출력 예시
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] |
- 입출력 예 #1
- (1). 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다. 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
- (2). 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.
- (3). 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.
- 입출력 예 #2
- (1). 모든 기능이 하루에 1%씩 작업이 가능하므로, 작업이 끝나기까지 남은 일수는 각각 5일, 10일, 1일, 1일, 20일, 1일입니다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능합니다.
- (2). 따라서 5일째에 1개의 기능, 10일째에 3개의 기능, 20일째에 2개의 기능이 배포됩니다.
⏰ 문제 풀이 정리 (feat. 문제이해를 제대로 못해서 그림으로 정리)
⏰ 풀이
import java.util.*;
import java.util.Queue;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> queue = new LinkedList();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
//프로세스 남은 양
for (int i = 0; i < speeds.length; i++) {
int day = 0;
while(progresses[i] + (day * speeds[i]) < 100){
day++;
}
queue.add(day);
}
int count = 0; //카운트
int temp = queue.peek(); //처음 큐
while (!queue.isEmpty()){
if(queue.peek() <= temp)
{
queue.poll();
}
else{
temp = queue.poll();
}
count++;
if(queue.isEmpty()){
arrayList.add(count);
}
else if (queue.peek() > temp) {
// 뒷 값이 더 큰 경우
arrayList.add(count);
count = 0;
temp = 0;
}
}
int[] answer = new int[arrayList.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = arrayList.get(i);
}
return answer;
}
}
- "Queue" 를 이용한 풀이를 진행한 것이다.
- 100% 되려면 어느 정도 기간이 걸리는 지 확인하고 그 날짜를 Queue.add 진행하였다.
- 이전에 peek 했던 데이터보다 현재 데이터가 크거나 같을 때 배포를 진행 못한 것으로 보고,
- 반면에 peek 했던 데이터보다 현재 데이터가 작으면 배포를 완료했다고 보고 리턴을 시킨다.
⏰ 다른 풀이
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
List<Integer> answerList = new ArrayList<>();
for (int i = 0; i < speeds.length; i++) {
double remain = (100 - progresses[i]) / (double) speeds[i];
int date = (int) Math.ceil(remain);
if (!q.isEmpty() && q.peek() < date) {
answerList.add(q.size());
q.clear();
}
q.offer(date);
}
answerList.add(q.size());
int[] answer = new int[answerList.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = answerList.get(i);
}
return answer;
}
}
- 끝나는 날짜를 미리 예측해서 값을 넣어주는 방법이다.
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] n번째 원소부터 (0) | 2023.08.09 |
---|---|
[프로그래머스] 조건에 맞게 수열 변환하기 3 (0) | 2023.08.08 |
[프로그래머스] 조건에 맞게 수열 변환하기 2 (0) | 2023.08.08 |
댓글