https://www.acmicpc.net/problem/15650

 

조합 문제이다.

구현에 있어서 순열과 다른 점은,

조합의 경우 순서가 없기 때문에 check만 확인해서 True인 것들만 출력하면 되지만

순열의 경우 1, 2, 5와 1, 5, 2가 다른데 check 확인 후 출력하면 항상 앞에서부터 1, 2 5로 출력이 될 것이기 때문이다.

따라서 조합은 뽑은 수열을 위한 리스트가 따로 없음을 유의하면 순열과 다른 점은 없다.

순열과 달리 시작부가 dfs(0, 0) = dfs(idx, cnt) 으로 시작하는 것은

dfs를 재귀호출 했을 때 리스트의 처음부터 다시 탐색해야 하는 '순열'과는 달리

조합은 지금까지 탐색했던 것들은 다시 탐색할 필요가 없기 때문에 현재 인덱스를 저장해놓기 위함이다.

(설명추가: 조합은 1을 한번 선택해서 조합을 꾸렸다면, 그게 1이 포함된 조합의 전부이다.

즉, 1이 포함된 조합 선택이 끝나면, 그 이후로는 1을 선택하지 않을 것이다. )

n, m = map(int, input().split())
lst = []
check = [False] * n
for i in range(1, n+1):
    lst.append(i)

def Print():
    for i, v in enumerate(check):
        if v == True:
            print(lst[i], end = ' ')
    print("")

def dfs(idx, cnt):
    if cnt == m:
        Print()
        return
    for i in range(idx, n):
        if check[i] == True:
            continue
        check[i] = True
        dfs(i, cnt+1)
        check[i] = False

dfs(0, 0)  # lst의 0번째 인덱스부터 살펴보면서 / 0번째 수열부터 뽑을 것임

 

 

https://yabmoons.tistory.com/99

를 참고했다.

'알고리즘 > 백트래킹' 카테고리의 다른 글

2차원 배열에서 조합 선택하기  (0) 2019.12.20
14888. 연산자 끼워넣기  (0) 2019.11.28
2580. 스도쿠  (0) 2019.11.27
9663. N-Queen  (0) 2019.11.26
15649. N과 M(1)  (0) 2019.11.22

+ Recent posts