관리 메뉴

100세까지 코딩

[프로그래머스] Lv0.배열 조각하기 본문

코딩테스트/자바

[프로그래머스] 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(원본 배열, 복사할 길이)가 있다.