본문 바로가기

Algorithm/Programers - Java

[프로그래머스(Java)] 리스트 자르기 / Arrays.copyOfRange

 

Level. 0

 

문제

정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. 
slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.

n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로

올바르게 슬라이싱 한 리스트를 return 하도록 solution 함수를 완성해 주세요.

 

풀이 1

import java.util.Arrays;

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int[] answer = {};
        switch(n){
            case 1:
                answer = Arrays.copyOfRange(num_list, 0, slicer[1]+1);
                break;
            case 2:
                answer = Arrays.copyOfRange(num_list, slicer[0], num_list.length);
                break;
            case 3:
                answer = Arrays.copyOfRange(num_list, slicer[0], slicer[1]+1);
                break;
            case 4:
                int size = (slicer[1] + 1 - slicer[0] ) / slicer[2];
                if((slicer[1] + 1 - slicer[0])%slicer[2] != 0) size += 1;
                answer = new int[size];
                int index = 0;
                for(int i=slicer[0]; i<=slicer[1]; i+=slicer[2]){
                    answer[index++] = num_list[i];
                }
                break;
        }
        return answer;
    }
}

 

Arrays.copyOfRange - 특정범위 배열 복사

1. Arrays.copyOf()

Arrays.copyOf(원본 배열, 복사할 길이)

원본배열을 index 0부터 두 번째 인자로 넣은 길이만큼 복사한다.

원본 배열이 입력한 길이보다 작을 경우 이후의 값은 기본값으로 초기화되어 복사된다. 

 

2. Arrays.copyOfRange()

Arrays.copyOfRang(원본 배열, start 인덱스, end 인덱스)

 

 

풀이 2 

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int start = 0, end = num_list.length-1, step=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];
                step = slicer[2];
                break;
        }
        
        int[] answer = new int[(end - start + step) / step];
        int index = 0;
        for(int i=start; i<=end; i+=step){
            answer[index++] = num_list[i];
        }
        
        return answer;
    }
}

 

라이브러리를 사용하지 않고 반복문 하나로 해결하였다.

첫 번째 풀이보다 직관적이고 좋은 풀이인 것 같다. 

 

int[] answer = new int[(end - start + step) / step];

배열의 크기를 구하는 식!

 


다른 풀이

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;
    }
}

 

 

 

 

 


https://school.programmers.co.kr/learn/courses/30/lessons/181897

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr