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
'Algorithm > Programers - Java' 카테고리의 다른 글
[프로그래머스(Java)] 기사단원의 무기 (0) | 2023.08.05 |
---|---|
[프로그래머스(Java)] 두 개 뽑아서 더하기 / Set , Arrays.sort() (0) | 2023.08.05 |
[프로그래머스(Java)] 이진수 더하기 / parseInt, toString, toBinaryString (0) | 2023.07.29 |
[프로그래머스(Java)] 컨트롤 제트 / Stack String.split() (0) | 2023.07.29 |
[프로그래머스(Java)] 두 수의 합 / BigInteger (0) | 2023.07.29 |