32. [Java] 배열 조각하기
https://school.programmers.co.kr/learn/courses/30/lessons/181893
- 정수 배열 arr와 query가 주어진다.
- query를 순회하면서 다음 작업을 반복한다.
- 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버린다.
- 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버린다.
- 위 작업을 마친 후 남은 arr의 부분 배열을 return
- 5 ≤ arr의 길이 ≤ 100,000
- 0 ≤ arr의 원소 ≤ 100
- 1 ≤ query의 길이 < min(50, arr의 길이 / 2)
- query의 각 원소는 0보다 크거나 같고 남아있는 arr의 길이 보다 작다.
정답코드
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[] query) {
int start = 0;
int end = arr.length;
for (int i = 0; i < query.length; i++) {
if (i % 2 == 0) {
// 짝수 인덱스 : query[i] 뒷부분 버리기
end = start + query[i] + 1;
} else {
// 홀수 인덱스 : query[i] 앞 버리기
start = start + query[i];
}
}
return Arrays.copyOfRange(arr, start, end);
}
}
핵심은 start
와 end
를 조정하면서 배열의 유효 범위를 점점 줄여나가는 방식이다.
1. 시작 인덱스와 끝 인덱스를 담을 start, end 변수를 각각 선언한다.
처음에는 배열 전체가 유효 범위이므로 start = 0
(맨 앞), end = arr.length
(맨 끝)으로 설정한다.
→ arr[start:end]
는 처음엔 전체 배열이다.
2. query
배열을 순회하면서, 짝수 번째(i % 2 == 0) 또는 홀수 번째(i % 2 == 1)인지에 따라 배열의 앞 또는 뒤를 잘라낸다.
1) 짝수 인덱스일 때 (i % 2 == 0);
end = start + query[i] + 1;
- query[i]번째 인덱스까지만 남기고 뒷부분을 제거한다.
- 왜 +1? → copyOfRange()는 end 인덱스를 포함하지 않기 때문에, 원하는 인덱스까지 포함시키려면 +1이 필요하다.
- 예: query[i] = 4일 때, 0~4번 인덱스까지 포함하려면 end = 5가 되어야 한다.
2) 홀수 인덱스일 때 (i % 2 == 1);
start = start + query[i];
- 의미:
query[i]
번째 인덱스까지 버리고 그 뒷부분만 남긴다. - 예:
query[i] = 2
라면, 0~1 인덱스는 버리고, 2번 인덱스부터 사용
✅ Arrays.copyOfRange(arr, start, end);
자바에서 배열을 슬라이싱(slice)하는 가장 대표적인 방법이다.
Arrays.copyOfRange(원본배열, 시작인덱스, 끝인덱스+1);
startIndex
: 포함됨 (inclusive)endIndex + 1
: 미만 (exclusive) → 그래서+1
해줘야 진짜endIndex
까지 포함됨
짝수 인덱스일 때 end = query[i] + 1 만 하면 안되는 이유
왜냐하면 query[i]
는 현재 잘려진 배열의 인덱스이기 때문에, 전체 배열 기준으로는 start + query[i] + 1
이 되어야 한다.
출처 : chatGPT 답변