N-Queen이나 부분집합 구하는 문제 풀다 보면 다들 백트래킹 백트래킹 하는데요. 솔직히 저는 그냥 재귀로 다 돌리는 완전탐색이랑 뭐가 다른 건지 감이 잘 안 옵니다.


예를 들어서 1부터 N까지 숫자 중에 M개 고르는 걸 이렇게 짜면요.


def solve(start, path):
    if len(path) == M:
        print(path)
        return
    for i in range(start, N + 1):
        solve(i + 1, path + [i])


이것도 그냥 재귀로 다 뽑는 거잖아요. 근데 이건 백트래킹이라고 부르고, 그냥 완전탐색은 완전탐색이라고 부르고. 제가 이해하기론 백트래킹은 중간에 "아 이 경로는 답 안 나오겠다" 싶으면 더 안 내려가고 되돌아오는 거라고 하던데, 그게 가지치기(pruning) 맞나요?


그러니까 완전탐색은 모든 경우를 무조건 끝까지 다 보는 거고, 백트래킹은 탐색은 하되 유망하지 않은 가지는 잘라서 안 보는 거, 이렇게 이해하면 되는 걸까요? 아니면 백트래킹 자체가 완전탐색의 한 종류인 건가요? 이 둘 관계가 계속 헷갈려서요. 실제로 가지치기 조건을 언제 넣어야 효과가 큰지도 궁금합니다.