자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1
3 1
예제 출력 1
1
2
3
예제 입력 2
4 2
예제 출력 2
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
예제 입력 3
4 4
예제 출력 3
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
백트래킹 기법을 사용한 순열을 생성하는 문제입니다.
n,m = map(int,input().split(' '))
s = [] # 현재 선택한 숫자들을 저장하는 리스트
def dfs():
if len(s) == m: # 기저 조건 (Base Case)
print(' '.join(map(str, s))) # 리스트 `s`를 공백으로 구분하여 출력
return # 재귀 종료
for i in range(1, n+1): # 1부터 n까지 반복
if i not in s: # 중복 없이 숫자 선택
s.append(i) # 숫자 추가
dfs() # 재귀 호출
s.pop() # 백트래킹 (이전 상태로 복귀)
dfs()
s
리스트는 현재까지 선택한 숫자를 저장하고, pop()
을 이용해 이전 상태로 되돌아감현재 코드는 숫자를 중복 없이 선택하지만, 중복 선택을 허용하는 경우 아래처럼 변경할 수 있음.
def dfs():
if len(s) == m:
print(' '.join(map(str, s)))
return
for i in range(1, n+1): # 중복 허용 (숫자 선택 후 제거하지 않음)
s.append(i)
dfs()
s.pop()
m
인 모든 순열을 생성s.pop()
을 사용하여 이전 상태로 되돌려 백트래킹 수행