-
카테고리
-
세부 분야
알고리즘 · 자료구조
-
해결 여부
미해결
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 가 일어날까요??
영상에 이러한 설명이 없어 질문합니다.
답변을 작성해보세요.
0
푸샵맨 코딩스터디
지식공유자2020.10.08
안녕하세요
먼저 답변이 늦어서 죄송합니다.
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]+" ");
}
}
}
답변 1