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()을 사용하면 주소값 참조가 아닌 직접 복사를 할 수 있다.
이를 깊은 복사라 한다.
추가적으로 배열을 복사하는 여러가지 메서드들을 살펴보자!
Arrays.copyOf(원본배열, 복사할 길이);
Arrays클래스는 배열을 조작할 수 있는 메소드를 가진 클래스입니다. 이 클래스 안에 있는 Arrays.copyOf()를 사용하면 배열의 시작점 ~ 원하는 length까지 배열의 깊은 복사를 할 수 있습니다.
Arrays.copyOfRange(원본 배열, 복사할 시작인덱스, 복사할 끝인덱스) 인덱스는 0부터 시작하는것 기준
Arrays.copyOf()는 배열의 처음~지정한 length까지 복사하는 메서드였다면 Arrays.copyOfRange() 메서드는 복사할 배열 의 시작점도 지정할 수 있습니다.
'JAVA' 카테고리의 다른 글
JAVA Scanner 클래스중 nextInt( )사용 후 nextLine( ) 사용할때 유의점 (0) | 2022.05.02 |
---|