inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

정말 쉽게 풀어보는 코딩 테스트 top 기본 문제 (with 자바)

제로 이동(Move Zeros)

loop 안에서 shallow copy 와 deep copy 차이

233

josh

작성한 질문수 5

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 가 일어날까요??

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

java 코테 준비 같이 해요!

답변 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]+" ");

}

}

}

강의자료에 나오는 m과 n의 범위가 코딩하고 다른거 같습니다

0

254

0

나선형매트릭스 깃허브에 코드가 없는것같아요

0

209

0

로그 파일의 데이터 재정렬 코드가 깃허브에 없어요!

0

224

0

새로 생긴 기초강의 질문드려요

1

375

1

질문드립니다

1

219

1

Unique Paths Integer 질문입니다

0

219

1

subString 방법으로 문제 풀이 영상은 짤린건가요?

1

252

1

DFS 방식으로 푼 것이 맞나요?

0

308

2

질문드립니다~

0

196

1

left if문에 대해서

1

256

1

오타 인가요?

1

237

1

안녕하세요 강사님

1

189

1

질문 드립니다

0

172

2

Queue&Stack 문제해설집 문의

0

183

1

문제분석 로직 질문

1

230

1

시간 복잡도 문의드립니다.

1

232

1

시간복잡도 질문드립니다.

1

202

1

for-each 문 질문있습니다!

0

294

1

강의영상에서 사용된 로그 메소드가 궁금합니다.

2

281

2

강의자료 + 문제 이해 관련 질문입니다

1

278

3

강사님 오류맞나요?

1

207

1

강사님 시간 복잡도에 대해서 질문드립니다.

1

173

1

질문입니다.

1

201

1

문제에 대한 이해

1

313

1