프로그래머스에서 고득점 키트를 자바로 풀면서 정리했던 부분들

[알고리즘을 풀면서 많이 맞닥뜨릴수 있는 케이스들 정리]

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 [] 그대로 풀수도 있다.