[JAVA] 기능개발

dada·2024년 9월 16일
0

algorithm

목록 보기
10/17
import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] day = new int[progresses.length];
        
        //배포하는데 필요한 날짜를 저장한 queue
        Queue<Integer> q = new LinkedList<Integer>(); 
        
        for(int i = 0; i<progresses.length;i++){
            if((100-progresses[i]) % speeds[i]==0){
                day[i] = (100-progresses[i]) / speeds[i];
            }
            else{ // 나누어 떨어지지 않는 경우 
                day[i] = (100-progresses[i]) / speeds[i] + 1;    
            }
            q.add(day[i]);
        }
        
        //몇개의 기능이 배포될 수 있는지를 저장한 list 
        List<Integer> list = new ArrayList<Integer>();
        int cnt = 0; //배포 가능한 수 카운트
        int before = q.peek(); //queue의 이전 값을 before에 저장 
        
        while(!q.isEmpty()){ 
            //배포에 필요한 날짜가 이전보다 같거나 짧다면 -> 배포 불가능
            if(q.peek()<=before){
                q.poll(); //큐의 맨 앞에 있는 값 반환 후 삭제 
                cnt++; //카운트 증가
            }
            //배포에 필요한 날짜가 이전보다 크다면 -> 자기자신까지는 배포 가능
            else{
                list.add(cnt); //list에 카운트한 날짜를 추가
                cnt = 1; //카운트값 초기화 
                before = q.poll(); //before값 초기화 
            }
        }
        list.add(cnt); //마지막 배포에 필요한 날짜 추가 
        
        //ArrayList to List
        return list.stream().mapToInt(i -> i).toArray();
    }
}

풀이

  • 배포하는데에 기간이 얼마나 걸리는지를 저장한 queue에서 만약 이전(작업이 배포에 걸리는 시간)값이 현재(작업이 배포에 걸리는 시간)값보다 크거나 같다면 먼저 자기자신을 배포할 수 없다.
  • 대신 자기 자신의 값이 이전 값보다 크다면 새롭게 카운트를 세서 현재 요소 이전에 있던 것들을 배포할 수 있다.
  • 따라서 대소관계를 비교하고 카운트를 조건에 맞게 증가시켜주면서 몇개의 기능이 한번에 배포될 수 있는지를 저장하여 반환시켰다.
profile
CV, Vision AI 등을 공부합니다

0개의 댓글