개인적으론, 코딩테스트에 많이 나오지 않는 개념인 것 같습니다. 그만큼 어렵지 않은 개념이기도 해서 그런가 싶습니다. 하지만 꼭 소홀이 하게 되면 까먹게 되는데, 쉬운 만큼 내가 까먹었다고 인지할 때면 충격이 겁나게 큽니다...('머리가 어떻게 됐나'라고 느낄 정도)
더 이상 그 충격을 받고 싶지 않아 이렇게 글을 써봅니다.
백트레킹(Backtracking)
은 문제를 해결하기 위해 모든 가능한 경우를 시도하는 알고리즘입니다. 재귀 호출
을 사용하여 현재 상태에서 가능한 모든 다음 상태를 탐색하고, 제약 조건을 만족하지 않는 경우 이전 상태로 되돌아가 다시 탐색합니다.
- 현재 상태에서 가능한 모든 다음 상태를 탐색
- 다음 상태가 제약 조건을 만족하는지 확인
2-1. 만족한다면 탐색 종료
2-2. 만족하지 않는다면 이전 상태로 되돌아간다.- 모든 상태를 다 확인할 때까지 위를 반복합니다.
⏱️ 시간복잡도
백트래킹 알고리즘의 시간 복잡도는 주로 문제의 조건에 따라 달라지지만, 이 문제의 경우, 선택할 수 있는 숫자가 N개이고, 수열의 길이가 M이므로 총 경우의 수는 O(N^M)입니다. 따라서 최악의 경우에는 지수 시간이 소요될 수 있습니다.
😀 장점:
🙁 단점:
🤔 생각해볼것:
DFS가 재귀를 통해 구현된다는 점에서 비슷하지만, 백트래킹의 경우 현재 가는 길이 더 이상의 해가 아니라고 판단되면 돌아옵니다.
itertools
을 사용하여 문제를 좀 더 간결하게 풀 수 있어, 코딩테스트 문제에서 백트래킹 하나만을 두고 문제로 내지 않을 것 같습니다.📝 대표적인 문제
https://www.acmicpc.net/problem/9663