import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> que = new LinkedList<>();
//배포 가능까지 필요한 작업 기간
int[] days = new int[progresses.length];
//배포 기간 저장
for(int i=0; i<progresses.length; i++){
if(((100-progresses[i]) % speeds[i]) == 0){
days[i] = (100-progresses[i]) / speeds[i];
que.add(days[i]);
}else{
days[i] = (100-progresses[i]) / speeds[i];
que.add(days[i]+1);
}
}
// 결과값 저장
List<Integer> resultList = new ArrayList<>();
int result = 1; //첫번째 작업은 가장 먼저 배포가 됨
while(!que.isEmpty()){
int x = que.poll(); //첫번째 작업 소요 기간
while(!que.isEmpty() && x >= que.peek()){ //다음 작업이 존재하고 함께 배포가 가능할 경우
result++;
que.poll(); //같이 배포 해서 삭제
}
resultList.add(result); //결과값 저장
result = 1; //다음 배포를 위해 다시 1로 초기화
}
int[] answer = new int[resultList.size()];
for(int i=0; i<resultList.size(); i++){
answer[i] = resultList.get(i);
}
return answer;
}
}
해당 문제는 선입선출이 이루어져야 하기 때문에 Queue
를 사용해서 문제를 풀이했다.
100 - 각 기능의 현재 작업 진도
를 계산 해준 값에 각 기능의 작업속도
를 나눈 값을 저장해주었는데 테스트 11번에서 실패를 했음..
for(int i=0; i<progresses.length; i++){
days[i] = (100-progresses[i]) / speeds[i];
que.add(days[i]);
}
주어진 입출력 예에서는 모두 나눈 값이 0으로 떨어졌기 때문에
배포 기간이 하루씩 체크가 되는데
0으로 나누어 떨어지지 않는 경우가 있는 경우를 생각하지 못했다.
(ex. 7/3 = 2, 나머지는 1이기 때문에 하루가 더 소요된다)
100 - 각 기능의 현재 작업 진도
를 계산 해준 값에각 기능의 작업속도
를 나눈 값
나누어 떨어지는 경우
100-93 = 7/1 = 7 → 7일 소요
100-30 = 90/30 = 3 → 3일 소요
100-55 = 45/5 = 9 → 9일 소요
나누어 떨어지지 않는 경우(예시)
100-93 = 7/2 = 3 → 3+1일 소요
100-30 = 90/40 = 2 → 2+1일 소요
100-55 = 45/7 = 6 → 6+1일 소요
위의 문제를 개선하기 위해 아래 코드로 변경했다.
100 - 각 기능의 현재 작업 진도
를 계산 해준 값에각 기능의 작업속도
를 나눈 값이 0일 경우와 0이 아닐 경우 작업 기간이 하루 더 필요하기 때문에 +1
//배포 기간 저장
for(int i=0; i<progresses.length; i++){
if(((100-progresses[i]) % speeds[i]) == 0){
days[i] = (100-progresses[i]) / speeds[i];
que.add(days[i]);
}else{
days[i] = (100-progresses[i]) / speeds[i];
que.add(days[i]+1);
}
}
굳이 days 배열에 저장하지 않고 바로 큐에 값을 넣어줘도 상관 없다 ㅎ