프로그래머스에서 고득점 키트를 자바로 풀면서 정리했던 부분들
[알고리즘을 풀면서 많이 맞닥뜨릴수 있는 케이스들 정리]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 4 out of bounds f
문제가 되는 코드
import java.util.*;
import java.util.Map.*;
import java.util.stream.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
System.out.println(Arrays.toString(progresses));
System.out.println(Arrays.toString(speeds));
List<Integer> progressesList= Arrays.stream(progresses).boxed().collect(Collectors.toList());
List<Integer> speedsList= Arrays.stream(speeds).boxed().collect(Collectors.toList());
int day =0;
while(!progressesList.isEmpty()){
//동적으로 줄어들어도 알아서 따라 붙나? -> 중간에 바뀌는건 반영 안된다. (문제가됨)
int index = 0;
for(Integer speed:speedsList){
progressesList.set(index, progressesList.get(index)+speed);
index +=1;
}
System.out.println(progressesList);
System.out.println();
if(progressesList.get(0) >=100){
int delI = 0;
while(progressesList.get(delI)>=100){
progressesList.remove(delI);
delI +=1;
}
System.out.println(progressesList);
}
if(day ==5){
break;
}
day +=1;
}
return answer;
}
}
[아래와 같이 해결함]
import java.util.*;
import java.util.Map.*;
import java.util.stream.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
// System.out.println(Arrays.toString(progresses));
// System.out.println(Arrays.toString(speeds));
List<Integer> progressesList= Arrays.stream(progresses).boxed().collect(Collectors.toList());
List<Integer> speedsList= Arrays.stream(speeds).boxed().collect(Collectors.toList());
List<Integer> answerList = new ArrayList<Integer>();
int day =1;
while(!progressesList.isEmpty()){
System.out.println(day);
//동적으로 줄어들어도 알아서 따라 붙나? -> 중간에 바뀌는건 반영 안된다.
int index = 0;
for(Integer speed:speedsList){
progressesList.set(index, progressesList.get(index)+speed);
index +=1;
}
// System.out.println(progressesList);
// System.out.println();
if(progressesList.get(0) >=100){
int count = 0; //어차피 제거돼서 앞으로 오니까 굳이 index를 올릴필요 없다.
//여기 마지막에 [1개 남겨지고 제거되면 while문에서 outOfIndex문제 걸린다]
while(!progressesList.isEmpty() && progressesList.get(0)>=100){
progressesList.remove(0);
speedsList.remove(0);
count +=1;
// delI +=1;
}
if(count !=0){
answerList.add(count);
}
}
System.out.println(progressesList);
System.out.println(speedsList);
// 디버깅용
// if(day ==20){
// break;
// }
day +=1;
}
System.out.println(answerList);
answer = answerList.stream().mapToInt(i->i).toArray();
return answer;
}
}
unreachable statement - 에러 while()문이 있거나 break문에 걸려서 그 아래 코드는 도달하지 못한다는 의미이다. 다음과 같은 예가 있을 것 같다.
while(true){
break;
day +=1;
}
위에서 break;에 걸려서 day+=1;에는 도달하지도 못한다 이때 나는 에러라고 생각하면 된다.
사실 위의 문제같은 경우 List로 바꿔서 풀 필요가 없다. 그냥 횟수 Count만 하는 것이기때문에 그냥 int [] 그대로 풀수도 있다.