본문 바로가기

JAVA

JAVA-배열복사

public class kNumber {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] array ={1, 5, 2, 6, 3, 7, 4};
        int[][] commands ={{2, 5, 3}, {4, 4, 1}, {1, 7, 3}};
        int[] solution1 = solution.solution(array, commands);
        for (int i = 0; i<solution1.length; i++){
            System.out.println(solution1[i]);
        }


    }
}
    class Solution {
        public int[] solution(int[] array, int[][] commands) {
            int[] answer = new int[commands.length];
            int temp = 0;

            for (int i = 0; i < commands.length; i++) {

                int[] arraycopy = array; //--->
                //int[] arraycopy = array.clone();
                int first = commands[i][0];
                int last = commands[i][1];
                int order = commands[i][2];

                for (int j = first - 1; j < last - 1 ; j++) {
                    for(int k = j; k < last  ; k++ )
                        if(arraycopy[j] > arraycopy[k]){
                            temp = arraycopy[j];
                            arraycopy[j] = arraycopy[k];
                            arraycopy[k]=temp;
                        }
                }
                answer[i]= arraycopy[first + order-2];

            }



            return answer;
        }
    }

프로그래머스 k번째 수 문제를 풀던도중 배열을 복사해야하는 일이 생겼다.

 

답은 5, 6, 3 이 나와야하는데

 

5, 5, 3,이 나와서 디버깅을 해보았다.

 

 디버깅 결과 array 자체가 변화한걸 확인하고 

 

int[] arraycopy = array;

 이 코드는 주소값을 참조한다는 사실을 잊고 있었다.  따라서 

 

배열 복사에 대해 다시 공부했다.

 

위에 코드는 얕은 복사

 

 

int[] arraycopy = array.clone();

이처럼 Array.clone()을 사용하면 주소값 참조가 아닌 직접 복사를 할 수 있다.

 

이를 깊은 복사라 한다.

 

 

Array.clone()사용하고 실행시킨 결과 원하는 결과를 얻을 수 있었다.

 

추가적으로 배열을 복사하는 여러가지 메서드들을 살펴보자!

 

Arrays.copyOf(원본배열, 복사할 길이);

Arrays클래스는 배열을 조작할 수 있는 메소드를 가진 클래스입니다. 이 클래스 안에 있는 Arrays.copyOf()를 사용하면 배열의 시작점 ~ 원하는 length까지 배열의 깊은 복사를 할 수 있습니다.

 

Arrays.copyOfRange(원본 배열, 복사할 시작인덱스, 복사할 끝인덱스) 인덱스는 0부터 시작하는것 기준

Arrays.copyOf()는 배열의 처음~지정한 length까지 복사하는 메서드였다면 Arrays.copyOfRange() 메서드는 복사할 배열  의 시작점도 지정할 수 있습니다.