순열 재귀함수

chi·2023년 4월 11일

자료구조

목록 보기
5/13

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 값 반환해야

호출된 장소에서도 count 변경됨
return count

return 0 이면 nonetype으로 알아듣네

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)
    

오류남

0개의 댓글