본문 바로가기
Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 리스트자르기

by 외계나무 2024. 4. 8.

프로그래머스 - level 0 리스트 자르기

처음에는 switch - case 문으로 풀려고 시도함.

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int[] answer;
        int a = slicer[0];
        int b = slicer[1];
        int c = slicer[2];
        switch(n) {
            case 1:
                answer = new int[b+1];
                System.arraycopy(num_list, 0, answer, 0, b+1);
                break;
            case 2:
                answer = new int[num_list.length - a];
                System.arraycopy(num_list, a, answer, a, num_list.length - a);
                break;
            case 3:
                answer = new int[b+1];
                System.arraycopy(num_list, 0, answer, 0, b+1);
                break;
            case 4:
                answer = new int[b+1];
                System.arraycopy(num_list, 0, answer, 0, b+1);
                break;
        }
        if(n < 1 || n > 4) answer = {1};
        return answer;
    }
}

근데 answer가 초기화 되지 않을 수 있어서 안 된대;;; 값이 들어가지 않을 수 있다고 했던가.. 아니 난 case 값 외의 것들도 다 예외를 만들어 줬잖아 싶었지만 default로 하면 됐더라... 하 switch - case 안 쓴지 오래됐다고 다 까먹었네...

하지만 if - else 문으로 갈아탐.

근데 이렇게 했더니 실행용 테스트 케이스는 통과하는데 실제 채점에서 절반 정도의 케이스가 런타임 에러가 남.

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int[] answer;
        int a = slicer[0];
        int b = slicer[1];
        int c = slicer[2];
        if(n==1) {
            answer = new int[b+1];
            System.arraycopy(num_list, 0, answer, 0, b+1);
        } else if(n==2) {
            answer = new int[num_list.length - a];
            System.arraycopy(num_list, a, answer, a, num_list.length - a);
        } else if(n==3) {
            answer = new int[b-a+1];
            System.arraycopy(num_list, a, answer, 0, b);
        } else {
            answer = new int[(int)((b-a)/c)+1];
            int j = 0;
            for(int i=a; i<=b; i+=c) {
                answer[j++] = num_list[i];
            }
        }

        return answer;
    }
}

 

이렇게 수정했는데 여전히 5개의 케이스에서 런타임 에러가 남.

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int[] answer;
        int a = slicer[0];
        int b = slicer[1];
        int c = slicer[2];
        if(n==1) {
            answer = new int[b+1];
            System.arraycopy(num_list, 0, answer, 0, b+1);
        } else if(n==2) {
            answer = new int[num_list.length - a];
            System.arraycopy(num_list, a, answer, a, num_list.length - a);
        } else if(n==3) {
            answer = new int[b-a+1];
            System.arraycopy(num_list, a, answer, 0, b-a+1);
        } else {
            answer = new int[(int)((b-a)/c)+1];
            int j = 0;
            for(int i=a; i<=b; i+=c) {
                answer[j++] = num_list[i];
                if(j>=answer.length) break;
            }
        }

        return answer;
    }
}

 

하지만 결국 원인을 찾아냈다...

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int[] answer;
        int a = slicer[0];
        int b = slicer[1];
        int c = slicer[2];
        if(n==1) {
            answer = new int[b+1];
            System.arraycopy(num_list, 0, answer, 0, b+1);
        } else if(n==2) {
            answer = new int[num_list.length - a];
            System.arraycopy(num_list, a, answer, 0, num_list.length-a);
        } else if(n==3) {
            answer = new int[b-a+1];
            System.arraycopy(num_list, a, answer, 0, b-a+1);
        } else {
            answer = new int[(int)((b-a)/c)+1];
            int j = 0;
            for(int i=a; i<=b; i+=c) {
                answer[j++] = num_list[i];
                if(j>=answer.length) break;
            }
        }

        return answer;
    }
}

이쯤에서 다시 보는 System.arraycopy()의 파라미터

총 5개가 들어가는데, 순서대로

1. 복사할 원본 배열

2. 복사할 원본 배열의 복사 시작 인덱스

3. 복사되어 생길 복사본 배열

4. 복사되어 생길 복사본 배열의 복사 시작 인덱스

5. 복사 해오는 배열의 길이

( 이 배열의 원소들이 , 이 인데스 원소부터 , 이 배열에 , 이 인덱스를 시작으로 , 이 길이의 배열이 복사된다 )

기존 배열의 일부를 가지고 새 배열을 만들 때는 4번이 무조건 0이 되어야 한다는 말씀... 5번은 복사 해오는 배열의 length... 이 마지막 인자를 종종 복사 해오는 마지막 인덱스로 생각하고 틀리는데 그것도 주의할 것... 인덱스 3부터 인덱스 6까지의 배열을 복사해 새로운 배열을 만들고 싶으면 ( 원본 배열 , 3 , 복사본 배열 , 0 , 6-3+1=4 ) 를 해야 하는 셈.