문제

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

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

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

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

나의 코드

import java.util.*;

public class FunctionalDevelopment {

	public static int[] solution(int[] progresses, int[] speeds) {
        List<Integer> list = new ArrayList<>();
        Queue<Program> pros = new LinkedList<>();
        for(int i=0; i<progresses.length; i++) {
        	pros.offer(new Program(progresses[i], speeds[i]));
        }
        int date = 0;
        while(!pros.isEmpty()) {
        	Program first = pros.peek();
        	if(first.progress < 100) {
        		for(Program p : pros) {
        			p.progress += p.speed;
        			date=0;
        		}
        	}else {
        		while(!pros.isEmpty()) {
        			Program prog = pros.peek();
        			if(prog.progress >= 100) {
        				pros.poll();
        				date++;
        			}else {
        				break;
        			}
        		}
        		list.add(date);
        	}
        }
        
        int[] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++) {
        	answer[i] = list.get(i);
        }
        return answer;
    }			    
}
class Program{
	int progress;
	int speed;
	Program(int progress, int speed) {
		this.progress = progress;
		this.speed = speed;
	}
}

 

나의 풀이

우선 큐를 활용하면 아주 쉬울 것이라는 생각이 들었다. (문제부터 큐를 쓰라고 말하고 있다)

1. 우선 프로그램들의 정보를 담을 도메인 객체를 만든다. Program Class(개발 현황, 개발 속도)

2. 배포할 프로그램의 개수를 담을 List<Integer> list 를 선언

3. 프로그램의 정보(개발 현황, 개발 속도) 를 담을 Queue<Program> pros 선언

4. for문으로 두개의 배열로 나누어져 있던 프로그램의 상태를 Queue에 담는다.

5. int date 는 개발이 완료되면 1씩 증가하는 카운팅 변수다.

6. Queue pros가 비어있지 않다면 계속해서 while문을 돌린다.

7. 첫 번째 프로그램의 정보를 first변수에 담는다.

8. 첫번째 프로그램의 개발 현황이 100보다 작다면

9. for문을 통해 Queue pros에 담긴 개발 현황들에 개발속도를 더해준다.

10. 만약 8번에 걸리지 않고 개발현황이 100 이상이라면 else로 들어간다.

11. 들어가자마자 Queue pros 가 비어있지 않다면 while문을 돌린다.

12. 넘어온 프로그램의 정보가 100 이상이라면 poll을 통해 뺀다. ( 왜 또 if 검사를 하는건 첫번째를 빼고 두번째 프로그램 판단을 위해)

13. poll로 빼줌과 동시에 date++를 해준다.

14. 10번의 else로 빠졌다는건 무조건 if문에 한번 걸리고 두번째를 판단하여 else로 갈수 있게해준다.

15. else로 갔다면 break를 통해 while문에서 빠져나가게 해준다. 빠짐과 동시에 list에 date를 추가한다.

16. 계속 반복하며 pros가 빈 큐가 될때까지 while한다.

17. for문을 통해 정답을 저장할 Array를 선언하여 저장하여 return 한다.

+ Recent posts