코딩테스트/자바
[프로그래머스] Lv0.배열 조각하기
100세까지 코딩
2023. 8. 27. 14:26
문제 설명
풀기 전 생각
- 나머지 기호로 짝수, 홀수를 나누기
- 문제가 원하는 계산을 한 후 그것에 맞는 크기로 temp 배열을 생성하여 복사하기
- arr에 temp를 얕은 복사 하여 계산 후 나온 배열을 지속적으로 전역적으로 쓸 수 있게 하기
class Solution {
public int[] solution(int[] arr, int[] query) {
int[] answer = {};
for(int i = 0 ; i < query.length; i++) { // query 배열 끝까지
if(i%2 == 0) { // 짝수면
int[] temp = new int[query[i]+1]; // query[i]번 뒷부분을 자르면 남는 크기로 temp 배열을 만듬
for(int j = 0; j < temp.length; j++){
temp[j] = arr[j]; // query[i]번 까지 복사
}
arr = temp; // temp는 지역 변수이므로 다른곳에서 쓸 수 없기에 arr에 얕은 복사
}else{ // 홀수면
int[] temp = new int[arr.length-(query[i])]; // query[i]번 앞부분을 자르면 남는 크기로 temp 배열 만듬
for(int j = 0; j < temp.length ; j++){
temp[j] = arr[j+query[i]]; // query[i]번부터 끝까지 복사
}
arr = temp; // temp는 지역 변수이므로 다른곳에서 쓸 수 없기에 arr에 얕은 복사
}
answer = arr; // 정답은 arr
}
return answer;
}
}
오류 및 개선
- 오류는 없지만 매번 배열을 원소 하나씩 복사하는 깊은 복사 및 얕은 복사를 해야 한다
- 그래서 성능적으로 좋은 코드를 소개하려 한다
최종
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++) { // query 배열 끝까지
if (i % 2 == 0) { // 짝수면 뒷부분을 자른다
end = start + query[i]; // 끝지점 = 시작점에서 query[i]번 인덱스까지
} else { // 홀수면 앞부분을 자른다
start += query[i]; // 시작점 += query[i] 앞부분이 잘려서 0이 되었다가 다시 또 잘리므로 더하기
}
}
return Arrays.copyOfRange(arr, start, end + 1); // arr을 start 인덱스부터 end + 1까지 복사
}
}
참고
Arrays.copyOfRange (원본 배열, 복사할 시작인덱스, 복사할 끝 인덱스)이며 끝 포함 X.
즉, end + 1을 해줘야 end까지 복사를 해준다.
또 다른 복사 방법은 Arrays.copyOf(원본 배열, 복사할 길이)가 있다.