Lumpy Space Princess - Adventure Time
코딩테스트/파이썬 알고리즘 문제풀이 입문

[파이썬 알고리즘 문제풀이 입문] 완전탐색 (백트랙킹, 상태트리와 CUT EDGE) / DFS(깊이우선탐색) 기초 - 순열 구하기 (DFS)

yaebb_82 2023. 7. 17.

*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.

 

 

 

문제

1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 M개를 뽑아 일렬로 나열하는 방법을 모두 출력합니다.

 

 

 

풀이

• 답안 : Python

import sys
input = sys.stdin.readline

def DFS(index):
    global count
    
    if index == M:
        for i in range(M):
            print(res[i], end=' ')
        print()
        count += 1
        return
    else:
        for i in range(1, N+1):        
            if visited[i] != 1:
                res[index] = i
                visited[i] = 1
                DFS(index+1)
                visited[i] = 0
                
N, M = map(int, input().split())
res = [0] * M
visited = [0] * (N+1)
count = 0
DFS(0)
print(count)

- 저번 '중복순열 구하기' 문제와 다르게 중복이라는 조건이 빠진 문제이다.

- 큰 로직은 저번 문제와 비슷했지만, 같은 숫자를 사용했는지의 여부를 체크하는게 관건이었다.

  → N+1만큼 0으로 초기화된 visited라는 리스트를 선언해주고, DFS 돌면서 사용했으면 1로 체크해준다.

  → 만약 1로 체크되어 있다면 사용 불가능 (X) / 0이면(=1이 아니면) 사용 가능 (O)

  → back 했을 때 사용했던 것을 풀어줘야 하기 때문에, DFS 호출 이후에 다시 0으로 돌려놓아야 한다.

 

 

 

반응형

댓글