파이썬 기초 알고리즘 질문입니다.
안녕하세요
### import random
#총 n명을 선택해 m개의 조에 k명씩 배열하는 경우의 수(단, m * k = n)
n, m, k = map(int,input().split())
a = list(range(1,n+1))
full=[]
for i in range(m):
b = a
li = []
if len(b)==0:
print(li)
break
for j in range(k):
num = random.choice(b)
b.remove(num)
li.append(num)
full = full + li
print(li)
print(sorted(full), len(full))
------------
이렇게 분류하는 작업을 하고있는데요.
b=a 구분이 for 루프 밖에있을때나,
안에있을때나 결과가 둘 다 정답으로 맞게 나오는데,
왜 이게 가능한지 모르겠습니다.
a = b 를 할 때, 값이 복사되는 것이 아니라, 메모리 주소가 복사되기 때문입니다.
id 함수는 변수가 어떤 메모리 영역에 있는지 확인하는 함수 입니다.
위 스샷을 보시면, a와 b가 같은 메모리 영역을 가리키는 것을 볼 수 있습니다.
즉, b = a 를 하게 되면 b 변수명은 a 변수의 별명이야~ 라는 뜻으로.. 리스트 내의 값에는 영향을 미치지 않습니다.
그러므로 b = a 를 한번 호출하던, 여러번 호출하던 값에는 영향을 주지 않아.. 항상 같은 결과가 나오게 된 것입니다.
원래 의도였던, b에 a의 값을 복사하기 위해서는 b = a.copy() 명령어로 명시적으로 내용을 복사하도록 해야 합니다.
copy() 함수는 배열 안의 값을 한땀 한땀 복사해서 새로운 배열을 만드는 함수입니다.
이걸 이용하면 다른 메모리에 있는 복사된 값을 b에 할당하게 됩니다. ^^
안녕하세요.
''' Online Python Compiler. Code, Compile, Run and Debug python program online. Write your code in this editor and press "Run" button to execute it. ''' import random #총 n명을 선택해 m개의 조에 k명씩 배열하는 경우의 수(단, m * k = n) n, m, k = map(int,input().split()) a = list(range(1,n+1)) full=[] b = a for i in range(m): li = [] if len(b)==0: print(li) break for j in range(k): num = random.choice(b) b.remove(num) li.append(num) full = full + li print(li) #print(sorted(full), len(full))여기에서
b=a는 깊은 복사라고 하여 b가 a와 같인 주소를 가르키기 때문에 for밖에 있으나 혹은 안에 있으나 결과 같이 같아 지게되지만
b=a[:]이렇게 하시면 결과 같이 달라지게 됩니다.
본래 알고리즘의 의도라면 위와 같이 하시고 밖에서 대입하시는 것이 맞습니다.