loading
본문 바로가기
Coding/Programers

[ Programmers ] _ 기능개발 ( java )

by NeuLyeo 2023. 12. 12.

[ Programmers ] _ 기능개발 ( java )

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

📚 Table of Contents

     

     

     

     

    문제

    문제 설명

     

     

     

    제한사항

     

     

     

    입출력 예

     

     

     

     

     

    문제 풀이

    문제 접근 ( 알고리즘 )

    • 각 기능의 작업 일을 계산 한다.
      • 남은 진도(100 - 현재 진도) % 작업 속도 == 0 인 경우
        • 큐에 ( 작업일 ) 추가

      • 남은 진도(100 - 현재 진도) % 작업 속도 == 0이 아닌 경우
        • 큐에 ( 작업일 + 1 ) 추가

    • 1번 째 기능의 작업 일을 확인한다. q.pool( )
    •  
    • 큐가 빌 때까지 반복, n 번 째 기능의 작업 일을 확인한다. q.peek( )
      • 1번째 기능의 작업일 보다 작거나 같은 경우
        • 1번째 기능의 작업 일과 같이 완료된다. => 같은 날 작업이 완료된다.
        • cnt 증가 cnt++
        • 다음 기능 확인 q.pool( )
      • 1번째 기능의 작업일 보다 큰 경우
        • 결과 배열에 cnt 추가 후 다음 기능의 작업일 확인

     

     

    예시

    progresses = [93 , 30, 55]
    speeds = [1, 30, 5]

    진행 일 계산
    // 남은 진도(100 - 현재 진도) % 작업 속도 == 0 인 경우

    1번째 기능 작업 진행일 : (100 - 93 ) / 1 = 7 

    // 남은 진도(100 - 현재 진도) % 작업 속도 == 0이 아닌 경우
    2번째 기능 작업 진행일 :  (100 - 30 ) / 30 +1 = 3 
    3번째 기능 작업 진행일 :  (100 - 55 ) / 5 = 45 / 5 = 9


    1번째 기능 7일에 완료

    2번째 기능 3일에 완료
    먼저 완료가 되어도 1번째 기능이 완료되야 완료 => 7일에 완료

    3번째 기능 9일에 완료

    7일에 2개 완료 9일에 1개 완료 => [2, 1]

     

     

     

     

    풀이

    Queue 사용

    import java.util.*;
    
    public class Solution {
        public int[] solution(int[] progresses, int[] speeds) {  
    
            // 결과를 담을 배열 선언  
            ArrayList<Integer> list = new ArrayList<>();  
            // 작업일를 담을 큐 선언  
            Queue<Integer> q = new LinkedList<>();  
    
            // 각 progresses의 최소일수 계산  
            // progresses 크기 만큼 반복  
            for (int i = 0; i < progresses.length; i++) {  
    
                // 남은 진도 % 작업 속도가 0으로 떨어지는 경우  
                if (((100 - progresses[i]) % speeds[i] == 0)) {  
                    q.add((100 - progresses[i]) / speeds[i]);  
    
                } else {  
                    // 남은 진도 % 작업 속도가 0으로 떨어진지 않으면 1일 추가  
                    q.add((100 - progresses[i]) / speeds[i] + 1);  
                }  
            }  
    
            // 1번째 기능 완료일을 담은 변수 (= 가장 긴 완료일)  
            int x = q.poll();  
            // 같은 완료일을 가진 기능의 개수 체크하는 변수
            int cnt = 1;  
    
            // 큐가 빌 때까지 반복  
            while (!q.isEmpty()) {  
    
                // n번째 기능 완료일이 1번째 기능 완료일 보다 작거나 같은 경우  
                if (x >= q.peek()) {  
    
                    // 같은 일에 cnt개의 기능이 배포가 가능하다.  
                    cnt++;  
                    q.poll();  
    
                } else {  
                    // n번째 기능 완료일이 1번째 기능 완료일 보다 큰 경우  
    
                    // 출력 배열에 cnt 추가  
                    list.add(cnt);  
    
                    // cnt를 다시 1로 초기화  
                    cnt = 1;  
    
                    // 가장 긴 완료일 변경  
                    x = q.poll();  
                }  
            }  
    
            // 마지막 cnt도 추가  
            list.add(cnt);  
    
            // 결과 배열로 출력  
            return list.stream().mapToInt(i->i).toArray();  
        }
    }