배열 복사 - Arrays.copyOfRange()
TIL 기준
1. 어떤 문제가 있었는지
2. 내가 시도해 본 것들
3. 어떻게 해결했는지
4. 뭘 새롭게 알았는지
=문시해알
:)
1. 어떤 문제가 있었는지
프로그래머스에서 K번째수 를 풀다가 배열을 복사하는 방법을 찾아보게 되었다.
먼저 프로그래머스 문제와 예시는 다음과 같다.
2. 내가 시도해 본 것들
🤓 코드 설계
문제를 풀기 위해 나름의 설계를 했다.
[이중 for문을 사용해서 배열 선언 및 저장하기]
(1) i~j번째 숫자 배열을 찾아서 새로운 배열에 저장하기
(2) 배열 정렬
(3) k 번째 숫자 반환
🤨 구현한 코드 (복잡한 로그 주의⛔️)
그렇게 해서 도출된 코드는 다음과 같다.
import java.util.Arrays;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
// 이중 for문
// 1. i~j번째 숫자 배열 - arr[]
for(int a=0; a<commands.length; a++) {
int iToJLength = commands[a][1]-commands[a][0]+1;// i+j까지의 길이
int[] arr = new int[iToJLength];
for(int b=0; b<iToJLength; b++) {
arr[b] = array[commands[a][0]-1+b];
}
// 2. 배열 정렬
Arrays.sort(arr);
// 3. k 번째 숫자 반환
answer[a] = arr[commands[a][2]-1];
}
return answer;
}
}
이중 for문으로 새로운 배열을 선언하고 값을 저장하는 방식이 복잡한 코드 구현인 것 같아서 아쉬움이 있었다.
그래서 다른 사람의 코드를 참고해 보았다.
3. 어떻게 해결했는지 + 4. 뭘 새롭게 알았는지
😯 다른 사람의 코드
import java.util.Arrays;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
for(int i=0; i<commands.length; i++){
int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
Arrays.sort(temp);
answer[i] = temp[commands[i][2]-1];
}
return answer;
}
}
Arrays에서 copyOfRange라는 메서드가 있다는 것을 새롭게 알게 되었다!
`Arrays.copyOfRange()` 메서드는 배열의 일부를 복사하여 새 배열을 생성하는 데 사용된다.
public static int[] copyOfRange(int[] original, int from, int to)
- `original`: 복사할 원본 배열
- `from`: 복사를 시작할 인덱스(포함됨)
- `to`: 복사를 종료할 인덱스(포함되지 않음)
이 메서드는 `from` 인덱스부터 `to - 1` 인덱스까지의 요소를 새로운 배열에 복사하여 반환하고 반환된 배열의 길이는 `(to - from)`와 같다.
예를 들어, 다음과 같은 배열이 있다고 가정해 볼 때,
int[] originalArray = {1, 2, 3, 4, 5};
`Arrays.copyOfRange(originalArray, 1, 4)`를 호출하면, 인덱스 1부터 3까지의 요소를 포함한 새 배열이 생성됩니다. 따라서 반환된 배열은 `{2, 3, 4}`가 됩니다.
이 메서드는 원본 배열의 일부를 복사하여 새 배열을 만들 때 유용하게 사용된다.
예를 들어, 배열에서 특정 범위의 요소를 추출하거나 임시 배열을 만들어 작업할 때 유용하다는 것이다!
그래서 다른 사람의 풀이와 많이 비슷하겠지만 나만의 코드로 다시 적어보았다.
😎 수정된 코드
package ImplementationAlgorithm;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
int[] array = {1, 5, 2, 6, 3, 7, 4};
int[][] commands = {{2, 5, 3}, {4, 4, 1}, {1, 7, 3}};
int[] answer = new int[commands.length];
// 이중 for문
// 1. i~j번째 숫자 배열 - arr[]
for(int a=0; a<commands.length; a++) {
// 1-1. for문으로 직접 배열 선언 및 저장
// int iToJLength = commands[a][1]-commands[a][0]+1;// i+j까지의 길이
// int[] arr = new int[iToJLength];
// for(int b=0; b<iToJLength; b++) {
// arr[b] = array[commands[a][0]-1+b];
// }
// 1-2. copyOfRange로 배열 저장
int[] arr = Arrays.copyOfRange(array, commands[a][0]-1, commands[a][1]);
// 2. 배열 정렬
Arrays.sort(arr);
// 3. k 번째 숫자 반환
answer[a] = arr[commands[a][2]-1];
}
System.out.println(Arrays.toString(answer));
}
}