https://www.acmicpc.net/problem/15649
import sys
input = sys.stdin.readline
def dfs(n, lst):
if n == M: # M개를 뽑았다면
answer.append(lst)
return
for i in range(1, N + 1):
if v[i] == 0: # 선택하지 않은 숫자
v[i] = 1 # 방문 처리
dfs(n + 1, lst + [i]) # lst에 방문한 i를 추가
v[i] = 0 # 방문 처리 해제
N, M = map(int, input().split())
answer = []
v = [0] * (N + 1) # 중복 확인을 위한 배열
dfs(0, [])
for lst in answer:
print(*lst)
백트래킹을 이용해 방문하지 않은 숫자로 조합해서 숫자를 만든다.