본문 바로가기
문제풀이/Programmers 문제풀이

[ 알고리즘 ] 코딩 - Programmers - 기능개발.java

by 마늘아빠 2021. 1. 6.
728x90
반응형

문제 링크

programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr


* 프로그래머스 - Level2 - (자바) 기능개발 - 큐 레벨별 순회

입출력예시

 


< 로직 >

* Queue에 progress와 speed를 저장

* Queue를 Level별로 순회하며 가장 앞의 큐가 100을 넘어가는지 체크

* 가장 앞의 큐 체크는 idx를 주어 해결

* 100이 넘어가지 않는다면 다시 큐에 저장

* 위 과정 반복

 


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
       Queue<int[]>queue = new LinkedList<int[]>();
	    	for(int i = 0; i < progresses.length; i++) { // 진행률과 개발속도를 큐에 저장
	    		queue.offer(new int[]{progresses[i], speeds[i]});
	    	}
	    	
	    	List<Integer> answerList = new ArrayList<Integer>();
	    	
	    	while(!queue.isEmpty()) { // 큐를 순회 할 것인데
	    		int size = queue.size(); // 사이즈별로 순회
	    		int idx = 0; // 가장 앞을 가리켜 줄 인덱스
	    		int count = 0; // 현재 사이즈에서 나올 수 있는 카운트
	    		
	    		for(int s = 0; s < size; s++) { // 사이즈 별 순회 시작
	    			int[] curProgress = queue.poll(); // 현재 진행률
	    			int nextProgress = curProgress[0] + curProgress[1]; // 다음 진행률
	    			// 가장 앞에있는 기능이고 진행률이 100이 넘었으면
	    			if(idx == s && nextProgress >= 100) { // 인덱스와 진행률을 함께 비교
	    				count++; // 기능 배포
	    				idx++; // 가장 앞 기능 순서 지정
	    			} else { // 아직 완료 안됐으면 다시 큐로
	    				queue.offer(new int[] {nextProgress, curProgress[1]});
	    			}
	    		}
	    		
	    		// 배포가 1개라도 되었을 경우에 리스트 저장
	    		if(count != 0) answerList.add(count);
	    	}
	    	// answer에 옮겨주자
	        int[] answer = new int[answerList.size()];
	        for(int i = 0; i < answer.length; i++) {
	        	answer[i] = answerList.get(i);
	        }
	        return answer;
    }
}
반응형