https://yangnyang.tistory.com/14
https://reinvestment.tistory.com/m/73
test = [1, 2, 3]
test_len = len(test)
N = 2 # 뽑을 순열의 개수
visit = [0] * test_len # 해당 index의 값을 사용했는지 여부
arr = [0] * N # 현재 순열을 담을 배열
arr_list = [] # 모든 순열을 담을 배열
def permutaion(level):
if level >= N: # 레벨이 N과 같은 경우(이미 N개의 원소를 선택한 경우)
arr_list.append(arr[:]) # 얕은 복사를 통해서 현재 순열을 추가한다.
return
else:
for i in range(test_len):
if visit[i]: continue # 이미 순열로 선택되었다면 통과
visit[i] = 1 # 아직 선택되지 않은 경우이므로 선택처리
arr[level] = test[i] # 순열을 선택
permutaion(level + 1) # 재귀를 통해 반복
visit[i] = 0 # 다음 트리로 내려가기 위해서 이전의 방문처리를 롤백
permutaion(0) # 0개의 원소를 선택한 경우부터 시작
print(arr_list)
# 실행결과
>>> [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
함수 안에서 밖에서 선언된 리스트에 접근하는 법은 리스트 연산자 쓰는 거 말곤...이걸 global 로 접근할 수가 있나?
가능.
li=[]
def ch():
global li
li+=[1]
ch()
print(li)
>>>[1]
근데 global 안 쓰면 result.append() 이런 거는 되는데 result+=어쩌고 이건 result를 밖의 리스트가 아니라 함수 안 새 지역변수로 인식해서 오류남
li=list(map(int,input().split()))
n=li[0]; r=li[1];
arr=[t for t in range(1,n+1)]; rep=[0]*r; count=0
result=[]
used=[False]*n
def perm():
global rep, used, arr, count, r, n
if count==r:
result.append(rep[:]) #리스트를 리스트에 넣을 때 꼭 복사해라 안 하면...mutable이라..
count-=1
return
else:
for i in range(len(arr)):
if used[i]==True:
used[i]=False
continue
else:
used[i]=True
rep[count]=arr[i] #[arr[i]] 이렇게 대괄호 넣어줘야 'int' object is not iterable 해결
count+=1
perm()
used[i]=False
count=0
perm()
print(result)
호출된 장소에서도 count 변경됨
return count

if not count:
count=0
이거로 count 0으로 만들어야...
li=list(map(int,input().split()))
n=li[0]; r=li[1];
arr=[t for t in range(1,n+1)]; rep=[0]*r
result=[]
used=[False]*n
def perm(count):
global rep, used, arr, r, n
if count==r:
result.append(rep[:]) #리스트를 리스트에 넣을 때 꼭 복사해라 안 하면...mutable이라..
count-=1
return count
else:
for i in range(n):
print(i)
if used[i]==True:
used[i]=False
continue
else:
used[i]=True
print(type(count), count)
rep[count]=arr[i]
#count+=1
count= perm(count+1)
if not count:
count=0
used[i]=False
perm(0)
print(result)

