[Java] 프로그래머스 Stack/Queue > 기능개발 자바

: ) YOUNG·2022년 2월 13일
2

알고리즘

목록 보기
55/422
post-thumbnail

문제

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

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.


입력

progressesspeedsreturn
[93, 30, 55][1, 30, 5][2, 1]
[95, 90, 99, 99, 80, 99][1, 1, 1, 1, 1, 1][1, 3, 2]

생각하기

Queue의 자료구조를 이용하면 쉽게 풀 수 있는 문제였다.

가장 앞의 작업이 끝나지 않으면 뒤의 작업이 먼저 끝나도 작업을 빼낼 수 없다는 규칙이 있기 때문에 stack의 자료구조를 이용해서도 풀 수 있지만 개인적으로 Queue가 더 편하기 때문에 Queue를 사용했음 그리고 프로그래머스에서 명시된 stack/queue라고 되어 있다 하더라도 굳이 2개의 자료구조만 사용하라는 법은 없기 때문에 더 효율적인 방법이 있다면 사용해도 될 것 같다.

동작
먼저 progressesspeeds 배열을 Queue에 옮겨 담기위해 progresses_que, speeds_que의 2개의 큐를 생성한다.

큐에 옮겨담았으면 progresses_que가 빌때까지 계속해서 반복한다.

큐를 비게 하기위해서는 speeds_queprogresses_que를 계속 더하면서
작업량을 계산한다.

하루 작업량을 마치게 되면 while(peek >= 100) 을 통해서 progresses_que의 첫번째 작업이 100이 달성 했는지 확인한다.

만약 peek이 100일 경우 progresses_quepoll()해서 progresses_que의 완료된 작업을 빼내준다. 여기서 progresses_que가 줄어들면 speeds_que도 똑같이 poll()작업을 해내주어야한다.

해당 과정을 통해서 완료된 작업을 계속해서 없애주면 결국 progresses_que는 비어있게 되고,
모든 작업이 완료되게 된다.


코드

import java.util.*;


class Solution {
   	static final Queue<Integer> progresses_que = new LinkedList<>();
	static final Queue<Integer> speeds_que = new LinkedList<>();
	static final List<Integer> list = new ArrayList<>();

	public int[] solution(int [] progresses, int[] speeds) {	

		int size = progresses.length;
	
		for(int i=0; i<size; i++) {			
			progresses_que.add(progresses[i]);
			speeds_que.add(speeds[i]);
		}

		while( !progresses_que.isEmpty() ) {

			size = progresses_que.size();
			for(int i=0; i<size; i++) {
				int progress = progresses_que.poll();
				int speed = speeds_que.poll();

				progresses_que.add(progress + speed);
				speeds_que.add(speed);
			}

			int peek = progresses_que.peek();

			int count = 0;
			while(peek >= 100) {
					count ++;
					progresses_que.poll();
					speeds_que.poll();

					if(!progresses_que.isEmpty()) {
						peek = progresses_que.peek();		
					}
					else {
						break;
					}
			}
			
			if(count != 0) {
				list.add(count);
			}
		}
			
		size = list.size();
		int answer[] = new int[size];
		int i=0;
		
		for(int num : list) {
			answer[i] = num;
			i++;
		}
		
		return answer;
	}
         
}

1개의 댓글

comment-user-thumbnail
2022년 2월 16일

다음 편 언제 나오나요?

답글 달기