(프로그래머) (스택/큐) 기능 개발(JAVA)

문제 설명

프로그래밍 팀은 기능 확장에 대해 작업하고 있습니다.

각 기능은 진행률이 100%일 때 서비스에 반영될 수 있습니다.


또한 각 형질의 발달 속도가 다르기 때문에 후형이 선행형보다 먼저 발달할 수 있으며, 이 경우 후형이 선행형과 함께 출시된다.


첫 번째로 배포되어야 하는 순서대로 작업 진행률이 포함된 정수 배열과 모든 작업에 대한 개발 속도와 함께 정수 배열 속도가 주어지면 각 배포에 배포된 기능 수를 반환하는 solve 함수를 완료합니다.

제한

작업 수(진행, 속도 배열 길이)는 100보다 작거나 같습니다.


작업 진행률은 100보다 작은 자연수입니다.


작업률은 100보다 작거나 같은 자연수입니다.


배포는 하루에 한 번만 발생할 수 있으며 하루가 끝날 때 발생할 것으로 예상됩니다.

예를 들어 진행률이 95%인 작업의 일일 개발률이 4%인 경우 2일 후에 배포됩니다.

문제의 해석


1단계) 각 작업에 소요되는 시간 확인

예제 2로 설명하자면 각 속도는 1, 1, 1, 1, 1, 1이므로 각 동작에 소요되는 시간은 같다.

(5, 10, 1, 1, 20, 1). 이것은 100과 같은 횟수를 찾기 위해 어드밴스에서 많은 속도를 순차적으로 합산하여 달성할 수 있습니다.

int() day = new int(progresses.length);
        for(int i = 0; i < progresses.length; i++){
            int cnt = 0;
            int percent = progresses(i);
            while(percent < 100){
                percent += speeds(i);
                cnt++;
            }
            day(i) = cnt;
        }

2단계) 모든 것을 한 번에 배포할 수 있는 시기 파악

내가 아무리 빨리 일을 끝내도 내 앞에 있는 친구가 일을 끝내지 못하면 나눠줄 수 없다.

즉, 뒤에 있는 사람 중에 나보다 느린 사람이 없으면 배포할 수 없다고 생각할 수 있습니다.

쉽게 말해서 처음부터 하나하나 끝내는데 걸리는 시간을 보면, 돌아오는 아이가 앞 친구보다 늦게 나오지 않으면 할 수 있다고 세고 생각할 수 있다.

그것을 공유하지 마십시오.

Queue<Integer> que = new LinkedList<>();
        int cnt = 1;
        int first = day(0);
        for(int i = 1; i < day.length; i++){
            if(i == day.length - 1){
                if(first < day(i)){
                    que.offer(cnt);
                    que.offer(1);
                }
                else{
                    que.offer(++cnt);   
                }
            }
            else{
                if(first < day(i)){
                que.offer(cnt);
                cnt = 1;
                first = day(i);
                }
                else{
                    cnt++;
                }
            }
        }

전체 코드

import java.util.*;
class Solution {
    public int() solution(int() progresses, int() speeds) {
        //1단계) 각 작업이 완료되는데 걸리는 날짜를 배열에
        int() day = new int(progresses.length);
        for(int i = 0; i < progresses.length; i++){
            int cnt = 0;
            int percent = progresses(i);
            while(percent < 100){
                percent += speeds(i);
                cnt++;
            }
            day(i) = cnt;
        }
        
        //2단계) 뒤에값이 앞에 값보다 커질때까지 cnt++하고
        //만약 뒤에값이 더 큰 값이 나오면 그 때 출력해 cnt값을 큐에 넣기
        Queue<Integer> que = new LinkedList<>();
        int cnt = 1;
        int first = day(0);
        for(int i = 1; i < day.length; i++){
            if(i == day.length - 1){
                if(first < day(i)){
                    que.offer(cnt);
                    que.offer(1);
                }
                else{
                    que.offer(++cnt);   
                }
            }
            else{
                if(first < day(i)){
                que.offer(cnt);
                cnt = 1;
                first = day(i);
                }
                else{
                    cnt++;
                }
            }
        }
        
        int() answer = new int(que.size());
        for(int i = 0; i < answer.length; i++){
            answer(i) = que.poll();
        }
        return answer;
    }
}