Skip to main content

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

핵심은 startend를 조정하면서 배열의 유효 범위를 점점 줄여나가는 방식이다.

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이 되어야 한다.

image.png

image.png


출처 : chatGPT 답변