[프로그래머스] 배열 조각하기
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 하는 solution 함수를 완성하라
나의 답안
나는 문제에서 말하는 알고리즘대로 remove 메서드를 이용하여
짝수 인덱스에서는 뒷부분을 자르고,
홀수 인덱스에서는 앞부분을 잘라내고
배열로 변환하도록 코드를 작성했다.
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[] query) {
ArrayList <Integer> list = new ArrayList<>();
for(int i=0; i<arr.length; i++)
list.add(arr[i]);
for(int i=0; i<query.length; i++) {
if(i%2 == 0) {
int size = list.size() - query[i]-1;
for(int j=0; j<size; j++)
list.remove(query[i]+1);
}
else {
for(int j=0; j<query[i]; j++)
list.remove(0);
}
}
int[] answer = new int [list.size()];
for(int i=0; i<list.size(); i++)
answer[i] = list.get(i);
return answer;
}
}
모범 답안
- 실제로 배열 내 값을 제거하는 과정을 생략
- start, end 변수를 이용하여 최종적으로 불러올 인덱스 범위를 조절
- copyOfRange변수를 사용하여 변수 불러옴
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[] query) {
int start = 0;
int end = arr.length - 1;
for (int i = 0; i < query.length; i++) {
if (i % 2 == 0) {
end = start + query[i] - 1;
} else {
start += query[i];
}
}
return Arrays.copyOfRange(arr, start, end + 2);
}
}
시작점과 끝점만 조정해가며 값을 불러올 수 있다는 생각을 못했다.
순진하게(?) 문제에서 얘기하는 대로 코드를 짰는데,
훨씬 효율적인 처리가 가능한 방법이 있었다.
더 효율적인 방법이 있다는 것을 항상 생각하자!
복습
Arrays.copyOfRange(arr, 시작인덱스, 끝인덱스):
arr배열의 시작인덱스부터 끝인덱스(미포함)의 앞까지 복사하여 반환