파이썬 내장함수인 조합을 쓰면 되겠다고 바로 떠올렸다. 문제는 출력 방법! permutations의 형식을 잘 알지 못해 출력해가며 올바른 정답 코드를 찾았다. 그런데 이 문제는 백트래킹에 분류되어 있다! 백트래킹으로 다시 문제를 풀어보았다.
import sys, itertools
input = sys.stdin.readline
N, M = map(int, input().split())
lst = [i+1 for i in range(N)]
nPr = itertools.permutations(lst, M)
for i in nPr:
print(*i)
print(nPr)하면 <itertools.permutations object at 0x105574040>가 뜨면서 itertools.permutations 객체를 직접 출력한다.
그치만 이는 반복가능한 객체이기에 굳이 list로 바꾸지 않고 for문으로 개별 원소에 접근할 수 있다.
반복가능한 객체라 print(*nPr)도 당연히 가능하다. 이를 이용해서 nPr을 출력해보면 아래와 같다.
이제 문제 의도에 맞게 1 2 형식으로 출력해보자. 즉, 튜플의 개별 원소를 공백으로 구분해서 출력하면 되므로 *연산자를 사용해서 튜플의 모든 원소를 개별 값으로 풀어 출력하자.
이를 모두 합치면 아래와 같다.
for i in nPr:
print(*i)
즉, 백트래킹은 모든 경우의 수를 탐색하는 대신, 조건을 걸어서 유망(promising)하지 않은 경우에는 탐색을 중지하고 이전 노드로 돌아가서 다른 경우를 탐색한다.
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
lst = []
def backtracking():
if len(lst) == M:
print(*lst)
return
for i in range(1, N+1):
if i not in lst:
lst.append(i)
backtracking()
lst.pop()
backtracking()

