알고리즘/프로그래머스

[프로그래머스] Day12 리스트 자르기

보름달빵 2024. 10. 1. 14:32

 

✅ 문제


 

 

 

✅ 풀이

 


 

문제를 보았을때 배열을 조건에 맞는 범위 만큼 자르는 문제였기 때문에 투 포인터를 사용하여 범위만 지정해주고 마지막에 해당 범위의 값들만 출력해주면 되겠다고 생각했다. 

 

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {


        int start=0; // 시작 인덱스 
        int end=num_list.length-1;   // 끝 인덱스 
        int plus=1; // 증가량 

        switch(n){
            case 1:
                end= slicer[1]; 
                break; 

            case 2:
                start=slicer[0]; 
                break; 

            case 3:
                start=slicer[0]; 
                end=slicer[1];
                break; 

            case 4: 
                start=slicer[0];
                end=slicer[1];
                plus=slicer[2];
                break;  
        }

         // 배열의 크기 계산
        int size = (end - start) / plus + 1;
        int[] answer = new int[size]; 

        // 슬라이싱한 요소들을 answer에 복사
        int idx = 0; // answer 배열의 인덱스
        for(int i = start; i <= end; i += plus) {
            answer[idx++] = num_list[i];
        }
        return answer; 
    }
}

 

 

문제의 풀이를 생각해내는 과정은 어렵지 않았으나, answer 배열의 크기를 정하는 부분에서 고민을 했어야하는 문제 같다. 

 

 

🍄 answer 배열의 크기를 구하는 방법

answer 배열이 단순히 start~end까지 1씩 증가했다면 배열의 크기는 (end-start) +1 이 되었을것이다. 하지만 증가량이 1이 아닌 N(임의의 자연수)라면 어떨까? 

 

예를들어 n=2 라고 해보자. n=2일때 선택되는 배열의 개수는 (전체배열의 길이) / n 이다. 2씩 증가한다는 것은 결국 n으로 나눈 몫을 구하는 값과 같다. 하지만 여기서 생각해야할것이 1을 추가하지 않으면  start를 포함하지 않고 start에서 end까지 이동하는 데 걸리는 '단계' 수만 계산하게 된다. 

 

따라서 (end-start)/plus +1 이 answer 배열의 사이즈가 된다. 

 

 

 

🍀 참고 

 

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int start = n == 1 ? 0 : slicer[0];
        int end = n == 2 ? num_list.length - 1 : slicer[1];
        int step = n == 4 ? slicer[2] : 1;
        int[] answer = new int[(end - start + step) / step];
        for (int i = start, j = 0; i <= end; i += step) {
            answer[j++] = num_list[i];
        }
        return answer;
    }
}

 

 

나의 경우는 n에 따라 구분하기 위해 switch-case 를 사용했지만 삼항 연산자를 이용해 푸는 풀이도 있다.