Post

[알고리즘] 백트래킹

[알고리즘] 백트래킹

백트래킹

  • 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법
  • DFS와 다른점
    • DFS는 가능한 모든 경로를 탐색
    • 백트래킹은 해를 찾는 도중 해가 될 수 없다고 판단되면, 되돌아가서 다시 해를 찾음 → 재귀 함수를 마치는 조건이 존재!
  • 재귀적으로 구현 (스택으로도 가능)
  • 재귀 함수가 종료되는 시점 명시 필요

image

시간 복잡도

  • 문제의 조건에 따라 다름
  • 중복이 가능 : O(N^N) (보통 N=8까지 가능)
  • 중복이 불가 : O(N!) (보통 N=10까지 가능)

자료 구조

  • 선택한 값 입력 배열
  • 방문 여부 확인 (재방문 금지)

예시 코드

  • 자연수 N과 M이 주어질 때, 숫자 1부터 N까지 중복 없이 M개를 고른 수열을 모두 구하는 프로그램
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
N, M = map(int, input().split())
ans = []

def backtracking():
	if len(ans) == M:
        print(' '.join(map(str, arr)))
        return 

    for i in range(1, N+1):
        if i not in ans: 
            ans.append(i)
            back()
            ans.pop()
    return
        
backtracking()
This post is licensed under CC BY 4.0 by the author.