문제
내가 작성한 정답
ArrayList
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[][] intervals) {
ArrayList<Integer> answer = new ArrayList<>();
for(int i=intervals[0][0]; i<=intervals[0][1]; i++){
answer.add(arr[i]);
}
for(int i=intervals[1][0]; i<=intervals[1][1]; i++){
answer.add(arr[i]);
}
int[] an = new int[answer.size()];
for(int i =0; i<an.length; i++){
an[i] = answer.get(i);
}
return an;
}
}
ArrayList + stream
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[][] intervals) {
ArrayList<Integer> answer = new ArrayList<>();
for(int i=intervals[0][0]; i<=intervals[0][1]; i++){
answer.add(arr[i]);
}
for(int i=intervals[1][0]; i<=intervals[1][1]; i++){
answer.add(arr[i]);
}
return answer.stream().mapToInt(i->i).toArray();
}
}
IntStream
import java.util.stream.*;
class Solution {
public int[] solution(int[] arr, int[][] intervals) {
return IntStream.concat(
IntStream.rangeClosed(intervals[0][0],intervals[0][1]).map(i->arr[i]),
IntStream.rangeClosed(intervals[1][0],intervals[1][1]).map(i->arr[i])
).toArray();
}
}
다른 사람들의 정답
Array
class Solution {
public int[] solution(int[] arr, int[][] intervals) {
int s1 = intervals[0][0], e1 = intervals[0][1], s2 = intervals[1][0], e2 = intervals[1][1], idx = 0;
int[] answer = new int[e1 - s1 + e2 - s2 + 2];
for (int i = s1; i <= e1; i++) {
answer[idx++] = arr[i];
}
for (int i = s2; i <= e2; i++) {
answer[idx++] = arr[i];
}
return answer;
}
}
arraycopy(복사할 배열, 처음 , 마지막+1)
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[][] intervals) {
int x1 = intervals[0][0];
int y1 = intervals[0][1];
int x2 = intervals[1][0];
int y2 = intervals[1][1];
int[] answer = new int[(y1-x1+1)+(y2-x2+1)];
// arr의 1부터 answer배열의 0번째 인덱스에 3개 붙여넣는다. => 0, 1, 2
// arr의 0부터 answer배열의 3번째 인덱스에 5개 붙여넣는다. => 3, 4, 5, 6, 7
// - src : 복사하고자 하는 원본 배열
// - srcPos : 원본 배열에서 복사를 시작할 인덱스
// - dest : 복사한 원소를 저장할 대상 배열
// - destPos : 대상 배열에서 복사한 원소를 저장할 시작 위치
// - length : 복사할 원소의 개수
System.arraycopy(arr, x1, answer, 0, y1-x1+1);
System.arraycopy(arr, x2, answer, y1-x1+1, y2-x2+1);
return answer;
}
}
stream
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[][] intervals) {
// 1. Arrays.stream(intervals): intervals라는 2차원 배열을 Stream<int[]>로 변환
// 각 요소는 intervals 배열의 한 행(int[])이 된다.
// 2. .flatMapToInt(ints -> ...): Stream<int[]>의 각 요소(int[] ints)에 대해 IntStream을 생성하고,
// 이렇게 생성된 모든 IntStream을 하나의 IntStream으로 평탄화(flatten)하여
// 2차원 배열의 각 행을 기반으로 생성된 IntStream들을 하나의 긴 IntStream으로 합친다.
// 3. Arrays.stream(Arrays.copyOfRange(arr, ints[0], ints[1] + 1)):
// - Arrays.copyOfRange(arr, ints[0], ints[1] + 1): arr 배열의 일부를 복사하여 새로운 배열을 생성
// - ints[0]: 복사를 시작할 시작 인덱스 (inclusive). intervals 배열의 각 행의 첫 번째 요소
// - ints[1] + 1: 복사를 끝낼 끝 인덱스 (exclusive). intervals 배열의 각 행의 두 번째 요소에 1을 더한 값
// (ints[1]까지 포함하기 위해 +1 -> exclusive이므로)
// - Arrays.stream(...): 복사된 배열을 IntStream으로 변환
// 4. .toArray(): 평탄화된 IntStream의 모든 요소를 int[] 배열로 변환하여 반환
return Arrays.stream(intervals)
.flatMapToInt(ints -> Arrays.stream(Arrays.copyOfRange(arr, ints[0], ints[1] + 1)))
.toArray();
}
}
Share article