https://programmers.co.kr/learn/courses/30/lessons/42586?language=java
입력
- progresses : 먼저 배포되어야하는 순서대로 작업의 진도가 적힌 정수 배열
- speeds : 각 작업의 개발 속도 정수 배열
출력
각 배포마다 몇 개의 기능이 배포되는지
풀이
각 기능의 진도율과 개발속도를 저장하는 Function 클래스를 만든다.
- 진도율이 100% 이상이 되는 기능수(cnt)를 세서 배포 시켜준다. ( list.add(cnt) )
- 진도율이 100% 이상이 되는 기능이 없다면 진도율을 증가시켜준다. ( f.progress += f.speed )
import java.util.*;
class Solution {
static class Function{
int progress;
int speed;
public Function(int progress, int speed){
this.progress = progress;
this.speed = speed;
}
}
public int[] solution(int[] progresses, int[] speeds) {
int[] answer;
ArrayList<Integer> list = new ArrayList<>();
Queue<Function> queue = new LinkedList<>();
for(int i=0;i<progresses.length;i++){
queue.offer(new Function(progresses[i],speeds[i]));
}
int cnt=0;
while(!queue.isEmpty()){
// 진도율이 100% 이상이면 배포
if(queue.peek().progress>=100){
queue.poll();
cnt++; // 기능 증가
}else{
if(cnt!=0) {
list.add(cnt); cnt=0; // 배포
}
// 진도율 증가
for(Function f : queue){
f.progress += f.speed;
}
System.out.println(queue.peek().progress);
}
}
list.add(cnt);
answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i]=list.get(i);
}
return answer;
}
}
+ 다른 풀이
각 기능의 진도율이 100%가 되기까지의 날짜를 미리 계산해서 하는 방식도 있었다.
각 기능의 작업기간 계산법
- int date = (int) Math.ceil((100-progresses[i])/speeds[i]);
- Math.ceil() : 소수점 이하를 올림한다.
이 때, 해당 작업기간과 앞 기능의 작업기간을 비교 (q.peek()<date)
- 짧으면 큐에 넣고 ( q.offer(date) )
- 길면 큐에 들어있던 기능을 모두 배포해준다. (리스트에 큐의 사이즈 넣고, 큐 초기화)
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> list = new ArrayList<>();
Queue<Integer> q = new LinkedList<>();
for(int i=0;i<speeds.length;i++){
// 각 기능의 작업기간 계산
int date = (int) Math.ceil((100-progresses[i])/speeds[i]);
// 앞 기능의 작업기간보다 길면 큐에 들어있던 기능 모두 배포
if(!q.isEmpty() && q.peek()<date){
list.add(q.size());
q.clear();
}
// 앞 기능의 작업기간보다 짧으면 큐에 넣음
q.offer(date);
}
list.add(q.size());
int[] answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i]=list.get(i);
}
return answer;
}
}
'Algorithm & Data Structure > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 Lv.2 > 가장 큰 수 (0) | 2022.02.28 |
---|---|
[Java] 프로그래머스 Lv.2 > 큰 수 만들기 (0) | 2022.02.28 |
[Java] 프로그래머스 Lv.2 > 다리를 지나는 트럭 (0) | 2022.02.28 |
[Java] 프로그래머스 : 숫자 문자열과 영단어 (0) | 2022.02.21 |
[Java] 프로그래머스 : 로또의 최고 순위와 최저 순위 (0) | 2022.02.21 |