투케이2K
223. (java/자바) 알고리즘 : 기능개발 - queue 큐 , linkedlist 링크드리스트 , FIFO 선입선출 본문
[개발 환경 설정]
개발 툴 : 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
* */