순열과 조합
backtracking 을 이용한 조합
n, m = map(int, input().split())
data = []
def combination(pre_num):
if len(data) == m:
print(*data)
else:
for i in range(1, n+1):
if pre_num < i:
data.append(i)
combination(i)
data.pop()
combination(0)
순열
n, m = map(int, input().split())
data = []
def permutation(pre_list):
if len(data) == m:
print(*data)
else:
for i in range(1, n+1):
if i not in pre_list:
data.append(i)
pre_list = data
permutation(pre_list)
data.pop()
permutation([])
백트래킹의 기본 구조를 익힐 수 있는 좋은 예제라고 생각합니다.
재귀로 구현하고 종료 조건을 명시합니다.
가장 중요한 반복문에서 백트래킹에서 divide and conquer할 추상 단위를 추가한 후, 처리, 삭제를 반복합니다.
백트래킹의 대부분의 문제가 위 과정에서 벗어나지 않기 때문에 아예 외워버리는 것이 좋다고 생각합니다.
'알고리즘' 카테고리의 다른 글
[알고리즘] union-find, disjoint set (0) | 2024.03.20 |
---|---|
[알고리즘] 문제 풀이 (0) | 2024.03.18 |
이진분류, 하노이 탑 (0) | 2024.01.08 |
무방향 그래프와 서로소 집합 (0) | 2023.12.10 |
n-queen 구현 (1) | 2023.12.03 |