https://programmers.co.kr/learn/courses/30/lessons/42586
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
progresses | speeds | return |
---|---|---|
[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개의 자료구조만 사용하라는 법은 없기 때문에 더 효율적인 방법이 있다면 사용해도 될 것 같다.
동작
먼저 progresses
와 speeds
배열을 Queue에 옮겨 담기위해 progresses_que
, speeds_que
의 2개의 큐를 생성한다.
큐에 옮겨담았으면 progresses_que
가 빌때까지 계속해서 반복한다.
큐를 비게 하기위해서는 speeds_que
와 progresses_que
를 계속 더하면서
작업량을 계산한다.
하루 작업량을 마치게 되면 while(peek >= 100)
을 통해서 progresses_que
의 첫번째 작업이 100이 달성 했는지 확인한다.
만약 peek
이 100일 경우 progresses_que
를 poll()
해서 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; } }
다음 편 언제 나오나요?