100세까지 코딩
[프로그래머스] Lv0.배열 조각하기 본문
문제 설명
풀기 전 생각
- 나머지 기호로 짝수, 홀수를 나누기
- 문제가 원하는 계산을 한 후 그것에 맞는 크기로 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(원본 배열, 복사할 길이)가 있다.
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.저주의 숫자 3 (0) | 2023.08.27 |
---|---|
[프로그래머스] Lv0.코드 처리하기 (0) | 2023.08.27 |
[프로그래머스] Lv0.주사위 게임 (0) | 2023.08.26 |
[프로그래머스] Lv0.정수를 나선형으로 배치하기 (0) | 2023.08.25 |
[프로그래머스] Lv0.OX퀴즈 (0) | 2023.08.18 |