
내가 생각했을때 문제에서 원하는부분
정수 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 함수를 완성해주세요.
내가 이 문제를 보고 생각해본 부분
첫 번째는 n = 3으로, slicer 배열이 {1, 5, 2}이고, num_list는 1부터 9까지 정수 리스트다.
두 번째는 n = 4에 같은 slicer와 num_list를 사용한다.
각 테스트 케이스에 대해 solution 메서드를 호출하며, 결과를 배열 포맷으로 출력한다.
solution 메서드는 입력된 n과 slicer 배열(a, b, c 값), 그리고 num_list를 활용하여 n의 값에 따라 다음 네 가지 경우로 분기해 리스트를 적절히 자른 배열을 만든다.
n == 1인 경우: num_list의 0번 인덱스부터 b번 인덱스까지 부분 배열을 잘라서 반환한다. 인덱스 범위를 맞추기 위해 b + 1까지 잘랐다.
n == 2인 경우: a번 인덱스부터 리스트 끝까지 잘라 반환한다.
n == 3인 경우: a번 인덱스부터 b번 인덱스까지 부분 배열을 잘라 반환한다.
n == 4인 경우: a번부터 b번 인덱스까지 c 간격으로 건너뛰며 값을 새 리스트에 담고, 그 리스트를 다시 배열로 만들어 반환한다.
각 상황에 맞게 Arrays.copyOfRange 메서드를 사용해 연속된 구간을 자르고, n == 4일 땐 직접 for문으로 간격 간 추출하는 방식을 사용하였다.
마지막으로 각 경우에 맞는 배열을 리턴하여 결과 값으로 출력한다.
코드로 구현
class Solution {
public int[] solution(int n, int[] slicer, int[] num_list) {
int a = slicer[0];
int b = slicer[1];
int c = slicer[2];
int[] answer;
switch (n) {
case 1:
answer = java.util.Arrays.copyOfRange(num_list, 0, b + 1);
break;
case 2:
answer = java.util.Arrays.copyOfRange(num_list, a, num_list.length);
break;
case 3:
answer = java.util.Arrays.copyOfRange(num_list, a, b + 1);
break;
case 4:
java.util.List<Integer> tempList = new java.util.ArrayList<>();
for (int i = a; i <= b; i += c) {
tempList.add(num_list[i]);
}
answer = new int[tempList.size()];
for (int i = 0; i < tempList.size(); i++) {
answer[i] = tempList.get(i);
}
break;
default:
answer = new int[0];
}
return answer;
}
}
프로그래머스 코드
package programmers;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
// 프로그래머스 리스트 자르기
public class Main48 {
public static void main(String[] args) {
// 첫 번째 예시
int n1 = 3;
int[] slicer1 = {1, 5, 2};
int[] num_list1 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] result1 = solution(n1, slicer1, num_list1);
System.out.println(Arrays.toString(result1)); // [2, 3, 4, 5, 6]
// 두 번째 예시
int n2 = 4;
int[] slicer2 = {1, 5, 2};
int[] num_list2 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] result2 = solution(n2, slicer2, num_list2);
System.out.println(Arrays.toString(result2)); // [2, 4, 6]
}
public static int[] solution(int n, int[] slicer, int[] num_list) {
int a = slicer[0];
int b = slicer[1];
int c = slicer[2];
int[] answer;
switch (n) {
case 1:
answer = Arrays.copyOfRange(num_list, 0, b + 1);
break;
case 2:
answer = Arrays.copyOfRange(num_list, a, num_list.length);
break;
case 3:
answer = Arrays.copyOfRange(num_list, a, b + 1);
break;
case 4:
List<Integer> tempList = new ArrayList<>();
for (int i = a; i <= b; i += c) {
tempList.add(num_list[i]);
}
answer = new int[tempList.size()];
for (int i = 0; i < tempList.size(); i++) {
answer[i] = tempList.get(i);
}
break;
default:
answer = new int[0];
}
return answer;
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.