programmers.co.kr/learn/courses/30/lessons/42586
각 작업의 진행상태와 작업속도를 담은 배열 int[] progresses, int[] speeds가 주어진다.
작업이 완료되어 배포될 때마다 몇 개의 작업이 배포되는지를 담은 배열을 반환해야한다.
1. 작업의 진도가 100까지 도달해야 새로운 기능을 배포할 수 있다.
2. 앞의 작업이 배포되기 전에 뒤의 작업이 배포될 수 없다. 뒤의 작업이 먼저 완료되더라도 앞이 끝날 때까지 기다렸다가 앞의 작업이 완료되면 함께 배포된다.
풀이 .
class Solution {
public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
ArrayList<Integer> answer = new ArrayList<Integer>();
ArrayList<Integer> pList = new ArrayList<Integer>();
ArrayList<Integer> sList = new ArrayList<Integer>();
for(int i = 0; i < progresses.length; i++) {
pList.add(progresses[i]);
sList.add(speeds[i]);
}
while(!pList.isEmpty()) {
while(pList.get(0) < 100) {
for(int i = 0; i < pList.size(); i++) {
pList.set(i, pList.get(i) + sList.get(i));
}
}
int cnt = 0;
while(!pList.isEmpty() && pList.get(0) >= 100) { // 완료되지 않은 작업 있으면 바로 중지
pList.remove(0);
sList.remove(0);
cnt++;
}
answer.add(cnt);
}
return answer;
}
}
progress와 speed를 ArrayList로 옮겨 완료된 작업을 하나씩 삭제하며 진행했다.
맨 앞의 작업의 진도가 100이 될 때까지 모든 작업이 각자 자신의 속도대로 진도를 나간다.
맨 앞이 100이 됐다면 100 미만의 작업이 나올 때까지 앞에서부터 모두 제거하며 개수를 센다.
추가
java.util.ConcurrentModificationException
처음에 짠 코드에서 위 에러가 발생했다.
원인은, 다음과 같다.
for(int progress : pList) {
if(progress >= 100) {
pList.remove(0);
sList.remove(0);
cnt++;
}else {
break;
}
}
pList에 대한 반복을 돌리면서 pList.remove()를 실행했기 때문이다.
다음과 같이 코드를 수정했고 java.lang.nullpointerexception이 발생했다.
while(pList.get(0) >= 100) {
pList.remove(0);
sList.remove(0);
cnt++;
}
반복 초반에는 상관이 없지만 마지막까지 가서 모든 원소가 지워지게 되면 pList는 비어있기 때문에 널포인트 예외가 발생한다.
!pList.isEmpty()를 추가하여 정답 코드를 완성하였다.
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
[PG] 프린터 JAVA (0) | 2020.12.30 |
---|---|
[PG] 다리를 지나는 트럭 JAVA (0) | 2020.12.28 |
[PG] 주식 가격 JAVA (0) | 2020.12.28 |
[PG] 베스트 앨범 JAVA (0) | 2020.12.28 |
[PG] 위장 JAVA (0) | 2020.12.27 |