프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 배열 조각하기(Java)

Sigfriede 2023. 6. 23. 01:00

  문제 설명

  정수 배열 arr와 query가 주어집니다.

  query를 순회하면서 다음 작업을 반복합니다.

  • 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
  • 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.

  위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

 

  제한사항

  • 5 <= arr의 길이 <= 100,000
    • 0 <= arr의 원소 <= 100
  • 1 <= query의 길이 < min(50, arr의 길이 / 2)
    • query의 각 원소는 0보다 크거나 같고 남아있는 arr의 길이보다 작습니다. 

 

  입출력 예

arr query result
[0, 1, 2, 3, 4, 5] [4, 1, 2] [1, 2, 3]
import java.util.ArrayList;
import java.util.List;
class Solution {
    public int[] solution(int[] arr, int[] query) {
        List<Integer> list = new ArrayList<>();
        for (int i : arr) {
            list.add(i);
        }
        for (int i = 0; i < query.length; i++) {
            if (i % 2 == 0) {
                list = list.subList(0, query[i] + 1);
            } else {
                list = list.subList(query[i], list.size());
            }
        }
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}

  제네릭 타입으로 Integer를 갖는 ArrayList를 생성합니다.

  for-each문에서 i는 arr의 원소를 받습니다. add 메소드를 이용하여 list에 i를 삽입합니다.

  for문이 query의 길이만큼 순회합니다.

  if문에서 i를 2로 나눈 나머지가 0이라면, 즉 query의 짝수 번째 인덱스라면 subList 메소드를 이용하여 0 번째 인덱스부터 query의 i번째 인덱스까지 잘라 list에 할당합니다. remove 메소드를 이용하여 원소를 일일이 제거해도 무방하지만, for문과 인덱스를 이용하여 자르는 경우에는 원소가 제거되면서 의도하지 않은 결과가 나타날 수 있습니다. 따라서 subList를 이용하여 리스트를 자르는 것이 안전하게 원하는 결과를 얻을 수 있습니다.

  만약 앞선 조건에 해당하지 않는다면 query의 홀수 번째 인덱스라는 뜻입니다. subList 메소드를 이용하여 query의 i번째 인덱스부터 list의 마지막까지 잘라 list에 할당합니다.

  answer 배열을 생성하고 크기는 list의 size만큼 지정합니다.

  for문을 이용하여 ArrayList를 Array에 복사할 것입니다. list의 size만큼 순회합니다.

  answer의 i 번째 원소에 list의 i 번째 원소를 할당합니다.