아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
호기로운게253
호기로운게25320.08.17

파이썬 기초 알고리즘 질문입니다.

안녕하세요

### 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 루프 밖에있을때나,

안에있을때나 결과가 둘 다 정답으로 맞게 나오는데,

왜 이게 가능한지 모르겠습니다.

55글자 더 채워주세요.
답변의 개수
2개의 답변이 있어요!
  • 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[:]

    이렇게 하시면 결과 같이 달라지게 됩니다.

    본래 알고리즘의 의도라면 위와 같이 하시고 밖에서 대입하시는 것이 맞습니다.