inflearn logo
강의

講義

知識共有

コーディングテスト [ ALL IN ONE ]

完全探索 (7) - 実装 [部分集合]

list1.append(list2)와 list1.append(list2[:])의 차이가 무엇인가요?

解決済みの質問

165

gungsusu9458

投稿した質問数 2

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요

def solution(l,k):
    result = []
    curr = []
    def backtracking(start, curr):
        if len(curr) == k:
            result.append(curr[:])
            return
        for i in range(start, len(l)):
            curr.append(i+1)
            backtracking(i + 1, curr)
            curr.pop()

    backtracking(0, curr)

    return result

위의 코드에서 if len(curr) == k: 안에 result.append(curr[:]) 대신 result.append(curr)을 넣으면 result = [[], [], [], [], [], []]와 같이 값이 제대로 추가가 안 되던데 무슨 차이가 있는 건가요?

main 함수에서

test1 = []
test2 = [1,2,3]
test1.append(test2)
print(test1)
test1 = []
test1.append(test2[:])
print(test1)

이와 같이 테스트를 해보면 두 프린트 결과 모두 [[1,2,3]]으로 동일하게 나오는데 위의 경우는 달라서 질문 드립니다.

python 코딩-테스트 알고리즘

回答 1

0

friedhamn

안녕하세요, 나상민님

문제의 핵심은 얕은 복사참조의 차이입니다.

result.append(curr)를 사용하면, curr 리스트의 참조를 결과 리스트에 저장합니다.

따라서, 백트래킹 과정에서 curr의 내용이 바뀔 때마다 이미 추가된 모든 항목도 같이 변합니다.

• 반면에, result.append(curr[:])는 curr의 얕은 복사본을 만들어 저장합니다.

이렇게 하면 그 시점의 curr 값이 보존되어, 이후에 curr가 변경되더라도 복사본은 그대로 유지됩니다.

main 함수에서 test2와 test2[:]를 비교했을 때는, 둘 다 한 번만 추가되기 때문에 출력 결과가 같지만, 백트래킹처럼 curr을 여러 번 수정하는 경우에는 복사본을 만들어 저장해야 올바른 결과를 얻을 수 있습니다. test1에 추가를 다 하신 후에 test2 배열의 원소를 수정한 후 test1을 출력하면 차이점을 이해하시게 될 겁니다.

즉, 백트래킹에서는 재귀 호출 후 curr.pop()으로 원소를 제거하면서 curr의 상태가 계속 바뀌므로, 현재 상태를 보존하려면 반드시 복사본(curr[:])을 추가해야 합니다.

노션 공유 링크

0

85

2

수업 중간에 내주신 문제는 해답을 알 수 없는걸까요?

0

74

2

최신 강의와 비교

0

81

2

Min Cost Climbing stairs 질문

0

74

2

노션 공유 부탁드립니다!

1

86

2

for 문에 sort 함수 를 사용하면

1

86

2

노션 공유 부탁드립니다.

0

101

2

디스코드가 올바르지 않다고 뜹니다..!

0

105

1

그래프

0

96

2

노션 공유

1

121

2

시간복잡도 질문

2

122

3

11강 질문

1

76

2

노션 공유 부탁드립니다

0

82

2

linkedList - BrowserHistory 코드 질문

0

72

1

라이브러리 사용

1

134

2

문제 교재는 따로 없는 거 맞나요?

1

200

2

LCA 관련해서 질문이 있습니다.

1

116

2

[Unique Paths] 완전탐색 / DP (후반부)

0

104

1

dp 계단오르기최소비용질문입니다.

0

106

1

Dynamic Array 의 size 정보가 저장되는 곳

2

159

2

노션공유가 안된듯 합니다

1

161

2

[코테 적용] 👉 [3번 문제] 완전탐색 (DFS, BFS) (전반부)

1

119

1

강의자료 만들 때 사용하신 프로그램이 뭘까요?

1

199

1

강의 처음부터 보고있는데 질문있습니다.

1

187

2