문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)


출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

 


코드

N, M = map(int, input().split())

num_list = [i + 1 for i in range(N)]
check_list = [False] * N

arr = []

def dfs(cnt):
    # 주어진 개수만큼 채워지면 출력
    if(cnt == M):
        print(*arr)
        return
    
    for i in range(0, N):
        if(check_list[i]): # 중복 처리
            continue
        
        check_list[i] = True # 수열 체크
        arr.append(num_list[i]) # 현재의 i를 기준으로 가지치기 시작, 수열 추가
        
        dfs(cnt + 1) # +1 번쨰 수열을 재귀

        arr.pop() # 수열의 마지막 자리 삭제
        print(arr)
        check_list[i] = False # 초기화
        
dfs(0)

 

백트래킹 문제이다.

백트래킹 알고리즘은 조건이 만족하는 모든 경우의 수를 찾는  알고리즘이다.

 

BFS로 접근한다.

BFS는 조건을 만족하는 경우의 수를 찾았다면 조건을 만족하기 직전 상태로 돌아가 다른 경우의 수를 찾는 방식이다.

 

 

복사했습니다!