개발자는 기록이 답이다

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_장난꾸러기) 본문

알고리즘/인프런 - Java알고리즘 입문

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_장난꾸러기)

slow-walker 2023. 10. 2. 10:08

 

 

6. 장난꾸러기

 

예시 입력 1 

9
120 125 152 130 135 135 143 127 160

예시 출력 1

3 8

힌트

출력해설 : 키 정보 152가 철수이고, 127이 철수 짝꿍입니다.

 

 

나는 해당 문제를 선택정렬해서 어렵게 풀려고 했었다....그냥 깊은 복사해서 비교하면될 것을....

 

 

강의 풀이(Time: 170ms Memory: 27MB Lang: Java)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public ArrayList<Integer> solution(int n, int[] arr) {
        ArrayList<Integer> answer = new ArrayList<>();
        int[] tmp = arr.clone(); // 깊은 복사
		// 깊은 복사 된거 오름차순하기
        Arrays.sort(tmp);
        for (int i = 0; i < n; i++) {
            if (arr[i] != tmp[i]) answer.add(i+1);
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        for (int x : T.solution(n, arr)) {
            System.out.print(x + " ");
        }
    }
}

 

 

arr.clone() vs Arrays.copyOf(arr, n)의 차이

 

1. `arr.clone()`- 깊은 복사(Deep Copy): 이 메서드는 원래 배열 `arr`의 내용을 복사하여 새로운 배열을 생성합니다. 새로운 배열은 원래 배열과 동일한 요소를 가지지만, 원래 배열과는 별도의 객체입니다. 따라서 두 배열은 서로 영향을 주지 않습니다.

   - 원래 배열의 크기를 그대로 유지하면서, 내용을 변경하고 싶을 때.
   - 원래 배열과 별개의 독립적인 배열이 필요한 경우.
   - 원래 배열의 내용을 그대로 유지하면서 작업을 수행한 후에 원래 배열을 비교하려는 경우.



2. `Arrays.copyOf(arr, n)` - 깊은 복사(Deep Copy): 이 메서드는 원래 배열 `arr`에서 처음 `n`개의 요소를 복사하여 새로운 배열을 생성합니다. 만약 `n`이 원래 배열의 길이보다 크다면, 추가된 요소는 0 또는 `null` 값으로 채워집니다. 이 메서드를 사용하여 배열을 복사할 때, 길이를 지정하여 원하는 크기의 배열을 생성할 수 있습니다.

   - 원래 배열에서 일부 요소를 복사하여 새로운 배열을 생성하고자 할 때.
   - 배열의 크기를 변경하려면 (`n`이 원래 배열의 길이보다 큰 경우) 추가된 부분을 0 또는 `null` 값으로 초기화하고자 할 때.

따라서 두 메서드는 배열을 복사하는 데 사용되지만, `arr.clone()`은 원래 배열의 내용을 그대로 복사하고, `Arrays.copyOf(arr, n)`은 길이를 지정하여 복사합니다. 선택은 상황에 따라 다를 수 있으며, 필요에 따라 적절한 메서드를 선택하면 됩니다.

 

깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)

 

- 깊은 복사(Deep Copy):
  - 원본 객체와 복사본은 서로 다른 메모리 공간에 존재합니다.
  - 복사본을 수정하더라도 원본 객체에는 영향을 주지 않습니다.
  - 객체 내부의 모든 객체 및 데이터도 복사됩니다. 즉, 재귀적으로 복사됩니다.


- 얕은 복사(Shallow Copy):
  - 원본 객체와 복사본은 같은 메모리 공간을 참조합니다. (객체의 주소가 복사됩니다)
  - 복사본을 수정하면 원본 객체에도 영향을 미칠 수 있습니다. (참조하는 객체가 같기 때문)
  - 객체 내부의 객체나 데이터는 참조만 복사됩니다. 따라서 내부 객체의 변경은 원본과 복사본에 모두 영향을 줄 수 있습니다.

  - list2 = list;