[JAVA , Lv2] 기능개발
[문제]
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[제한 사항]
- 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
- 작업 진도는 100 미만의 자연수입니다.
- 작업 속도는 100 이하의 자연수입니다.
- 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
[내 풀이]
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
ArrayList<Integer> al = new ArrayList<>() , speed = new ArrayList<>();
for(int i : progresses){
q.offer(i);
}
for(int i : speeds){
speed.add(i);
}
while(!q.isEmpty()){
int cnt = 0;
for(int i=0; i<q.size(); i++){
if(q.peek()>=100) q.offer(q.poll());
else q.offer(q.poll()+speed.get(i));
}//진도율 더해서 큐에 넣기
while(!q.isEmpty() && q.peek()>=100){
cnt++;
q.poll();
speed.remove(0);
}
if(cnt>0)al.add(cnt);
}
//ArrayList to int[]
return al.stream().mapToInt(i -> i).toArray();
}
}
[설명]
배열로 해서 푸는방법이 있고 큐(Queue)를 사용해서 푸는 방법이 있다.
나는 큐(Queue)를 사용해서 풀었는데 처음 구현한 코드는 아래와 같다.
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
ArrayList<Integer> al = new ArrayList<>();
for(int i : progresses){
q.offer(i);
}
while(!q.isEmpty()){
int cnt = 0;
for(int i=0; i<q.size(); i++){
if(q.peek()>=100) q.offer(q.poll());
else q.offer(q.poll()+speed[i]);
}//진도율 더해서 큐에 넣기
while(!q.isEmpty() && q.peek()>=100){
cnt++;
q.poll();
}
if(cnt>0)al.add(cnt);
}
//ArrayList to int[]
return al.stream().mapToInt(i -> i).toArray();
}
}
이 코드는 진행률을 더하는 부분을 주어진 배열 speeds[]를 사용해서 넣었다.
하지만 이 코드는 하루치 작업이 끝나고 배포할 갯수를 결정하는 반복문에서 q.poll()을 통해서 큐에서만 빠지기 때문이다.
이렇게되면
progresses = [90, 80, 95, 89, 60, 75, 80] , speeds = [10, 5, 1, 5, 10, 10, 10]일때 하루가 지나면
progresses = [100, 85, 96, 94, 70, 85, 90] , speeds = [10, 5,1, 5, 10, 10, 10] 이상태가 된다. 이후 개발이 완료된 프로젝트를 제거하면
progresses = [85, 96, 94, 70, 85, 90] , speeds = [10, 5,1, 5, 10, 10, 10]이렇게 된다. 즉, progresses와 speeds 둘다 줄어들어야 하는데 progresses만 줄어드는 상태가 된다.
따라서 이 부분을 해결하기 위해 ArrayList에 speeds를 넣어서 해결해주었다.
개발이 완료된 프로젝트를 제거할 때 speeds의 맨 앞 요소를 같이 제거해준 것이다.