투케이2K

223. (java/자바) 알고리즘 : 기능개발 - queue 큐 , linkedlist 링크드리스트 , FIFO 선입선출 본문

Java

223. (java/자바) 알고리즘 : 기능개발 - queue 큐 , linkedlist 링크드리스트 , FIFO 선입선출

투케이2K 2021. 8. 2. 07:56

[개발 환경 설정]

개발 툴 : Eclipse

개발 언어 : Java


[소스 코드]

package ex6;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

public class MainActivity4 {

   public static void main(String[] args) {
      // TODO Auto-generated method stub
      System.out.println("[Program Start]");
      System.out.println("");
      
      /**
       * [기능개발]
       * 1. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다
       * 2. 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 
       *    이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다
       * 3. 설 명 : 
       *    - 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능
       *    - 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다 
       *      하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다
       *    - 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능  
       *    - 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다
       * 4. 입출력 예시 : 
       *     - progresses = [93, 30, 55] / speeds = [1, 30, 5] / return = [2, 1]
       *     - progresses = [95, 90, 99, 99, 80, 99] / speeds = [1, 1, 1, 1, 1, 1] / return = [1, 3, 2]
       * 5. 프로그래머스 사이트 : https://programmers.co.kr/learn/courses/30/lessons/42586
       * */
      
      // 초기 변수 선언 실시
      //int pro_arr[] = {93, 30, 55}; // [1번]
      int pro_arr[] = {95, 90, 99, 99, 80, 99}; // [2번]
      //int sp_arr[] = {1, 30, 5}; // [1번]
      int sp_arr[] = {1, 1, 1, 1, 1, 1}; // [2번]
      
      
      // 결과 출력 메소드 호출
      System.out.println("결과 : " + Arrays.toString(solution(pro_arr, sp_arr)));
            
   }//메인 종료
   
   public static int[] solution(int[] progresses, int[] speeds) {
            
      // 인풋으로 들어온 데이터 확인 실시
      System.out.println("progresses : " + Arrays.toString(progresses));
      System.out.println("speeds : " + Arrays.toString(speeds));      
      System.out.println("");
      
      // 로직 처리 실시
      /**
       * [세부 설명]
       * 1. 93   30   55
       *    7    3    9
       *    =============
       *    7일째 2개
       *    9일째 1개
       *    
       * 2. 95   90   99   99   80   99
       *    5    10    1    1   20    1
       *    ============================
       *    5일째 1개
       *    10일째 3개
       *    20일째 2       
       * */
      
      // 큐배열을 선언 : 작업 완성일을 저장 하기 위함 (FIFO 구조 - 선입 선출 (먼저 입력이 먼저 출력))
      LinkedList<Integer> queue = new LinkedList<>(); // 큐의 생성
      
      
      // for 반복문을 돌면서 100% 까지 걸리는 일자 계산 실시
      for (int i=0; i<progresses.length; i++) {
         int nowValue = progresses[i]; //현재 작업된 퍼센트를 가져옵니다 [ex : [93] / [30]]
         int proUpdate = speeds[i]; // 하루에 작업 진행 상황을 가져옵니다 [ex : [1] / [30]]
         
         // [이해를 돕도록 로직 처리 과정 단계별 설명]
         int day = 100 - nowValue; // [7] / [70] 
         int checkDay = (day / proUpdate); // [7 / 1] / [70 / 30]
         int checkMod = (day % proUpdate); // [7 % 1] / [70 % 30]
         if(checkMod > 0) checkMod = 1; // 여기에서, 나머지 값이 0보다 크면 1값으로 교체합니다
         int totalDay = checkDay + checkMod;
         
         // 큐에 데이터 삽입 실시
         queue.add(totalDay);
      }
      System.out.println("queue : " + queue.toString());
      System.out.println("size : " + queue.size());
      System.out.println("");
      
      
      // 큐에 삽입된 데이터 크기를 확인 및 리턴 결과를 담기 위한 변수 선언
      ArrayList<Integer> list = new ArrayList();
      int saveValue = 0;
      int cnt = 1;
      
      
      /* while 문을 사용해서 큐가 전부 빌때까지 반복문을 수행합니다 
       * poll : 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환하고, 해당 요소를 큐에서 제거합니다
       */
      boolean stopFlag = false;
      while(!queue.isEmpty()) { // 큐에 데이터가 있을 경우 반복 수행 실시
         if (stopFlag == false) { // 처음 데이터만 넣고 비교를 수행하기 위해서 플래그 선언
            saveValue = queue.poll();            
            stopFlag = true;
         }  
         else {
            int data = queue.poll();            
            if(saveValue < data) { // 저장된 데이터가 다음 데이터 보다 작은 경우                                          
               list.add(cnt);
               cnt = 1;
               
               saveValue = data;
               if(queue.isEmpty()) list.add(cnt); // 마지막 값일 경우 배열에 삽입
            }
            else {               
               cnt ++;         
               if(queue.isEmpty()) list.add(cnt); // 마지막 값일 경우 배열에 삽입
            }
         }         
      }
            
      // 결과 반환 실시 [스트림 사용해 >> list to int 배열]      
      return list.stream().mapToInt(Integer::intValue).toArray();   
   }

}//클래스 종료

[결과 출력]

 


[요약 설명]

/**

* [기능개발]

* 1. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다

* 2. 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고,

*    이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다

* 3. 설 명 :

*    - 첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능

*    - 두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다

*       하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다

*    - 세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능

*    - 따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다

* 4. 입출력 예시 :

*    - progresses = [93, 30, 55] / speeds = [1, 30, 5] / return = [2, 1]

*    - progresses = [95, 90, 99, 99, 80, 99] / speeds = [1, 1, 1, 1, 1, 1] / return = [1, 3, 2]

* 5. 프로그래머스 사이트 : https://programmers.co.kr/learn/courses/30/lessons/42586

* */


 

반응형
Comments