TIL (Today I Learned)

배열 복사 - Arrays.copyOfRange()

Won's log 2024. 4. 8. 23:48

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)

 

Intelij에서 보았을 때

- `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));
    }
}