• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

loop 안에서 shallow copy 와 deep copy 차이

20.10.06 01:48 작성 조회수 143

0

안녕하세요

저는 처음에 문제를 

class Solution {
    public void moveZeroes(int[] nums) {
        int min = Integer.MAX_VALUE;
        int p = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) {
                nums[p] = nums[i];
                nums[i] = 0;
                p ++;
            }
        }
    }
}

이렇게 풀었었는데 nums[i] = 0 때문에 nums[p] 도 0 으로 할당 되더라구요

테스트 케이스로 예를 들면 [1, 2, 3, 0, 0] 일때 [0, 0, 0, 0, 0] 인 결과가 나옵니다.

class Solution {
    public void moveZeroes(int[] nums) {
        if (nums.length == 1) return;
        int p = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[p] = nums[i];
                p ++;
            }
        }

        for (int i = p; i < nums.length; i ++) {
            nums[i] = 0;
        }
    }
}

위의 코드와 같이 for loop 을 따로 실행하니까 제가 원하는 값([1, 2, 3, 0, 0])이 나오는데요 

왜 이러한 차이가 있을까요? array 를 서로 다른 loop 로 나눈것인데 왜 첫번째 코드에서 같은 loop 안에 있을때 shallow copy 가 발생하고, loop 를 둘로 나누었을때 deep copy 가 일어날까요??

영상에 이러한 설명이 없어 질문합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요 

먼저 답변이 늦어서 죄송합니다.

1) 먼저 위문제는 단순하게 array 위치를 알아 내는겁니다.

2) 질문주신 deep copy는 없습니다. 전부 shallow입니다

shallow copy :   shallowArr = nums;   주소값 공유

deep copy :  new 를 이용한 완전 다른 주소값

위에 질문 주신 내용에서 deep copy는 없습니다. 전부 shallow copy입니다

3)  위에 질문주신 첫번째 예제는

말씀하신것처럼

nums[i] = 0 때문에 nums[p] 도 0 으로 할당된것입니다. 그 부분만 주석으로 하시면 되네요

test 예제_

public class T01_MoveZeros_End {

//1 test case

public static void main(String[] args) {

T01_MoveZeros_End a = new T01_MoveZeros_End();

// int[] nums=  {0,1,0,3,12}; 

int[] nums=  {1, 2, 3, 0, 0}; 

a.shallowCopy(nums);

// a.solve(nums);

a.moveZeroes(nums);

a.print(nums);

System.out.println("=================");

a.moveZeroes2(nums);

a.print(nums);

}

public void shallowCopy(int[] nums) {

int[] shallowArr = null;

shallowArr = nums;

System.out.println(" print(shallowArr);");

    print(shallowArr);

System.out.println(" print(nums);");

    print(nums);

}

  public void moveZeroes(int[] nums) {

        int min = Integer.MAX_VALUE;

        int p = 0;

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

            if (nums[i] > 0) {

                nums[p] = nums[i];

                System.out.println("nums[p] "+nums[p]+" nums[i] "+nums[i]);

//                 nums[i] = 0;

                p ++;

                System.out.println("p "+p);

            }

        }

    }

  

  public void moveZeroes2(int[] nums) {

        if (nums.length == 1) return;

        int p = 0;

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

            if (nums[i] != 0) {

                nums[p] = nums[i];

                p ++;

                System.out.println("p "+p);

            }

        }

        for (int i = p; i < nums.length; i ++) {

            nums[i] = 0;

        }

    }

  

  

public void solve(int[] nums) {

print(nums);

//2 방번호, 방번호 기억

int curIndex =0;

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

if(nums[i] != 0) {

nums[curIndex] = nums[i];

System.out.println("curIndex "+curIndex+" i "+i);

curIndex++;

}

}

System.out.println("===22==");

print(nums);

// 0을 채운다

while(curIndex<nums.length) {

System.out.println(curIndex+" "+nums.length);

nums[curIndex]=0;

curIndex++;

}

System.out.println("===result==");

print(nums);

}

public void print(int[] nums) {

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

System.out.print("nums["+i+"]:"+ nums[i]+" ");

}

}

}