빠른 계산 능력을 이용하여 가능한 경우의 수를 일일이 나열하면서 답을 찾는 방법
Brute-Force 라고도 부름. 문제 푸는 '방법'이다.
완전 탐색의 대표적 유형. N!의 시간이 필요하기에 N이 한자리 수 일때만 완전탐색으로 할 수 있음
2진수를 이용하는 컴퓨터 연산을 이용하는 방식
문제에서 나올 수 있는 모든 경우의 수가 각각의 원소가 포함 되거나 포함되지 않는 두가지 선택으로 구성되는 경우 유용하게 사용 가능
문제를 만족하는 경우들을 만들어가는 방식
포함되거나 포함되지 않거나 두가지 선택을 가질 때 사용한다.
길 찾기 문제. 주로 완전탐색 + DFS/BFS 문제가 많이 나옴
조건을 처리할 추가적인 작업이 필요한 경우에 완전탐색으로 해결한 후에 이 방법을 적용하게 됨
반복/ 조건문을 통해 가능한 모든 case를 만들어 답을 구하는 방법
종류
"가능한 모든 방법을 탐색한다"
현재 상태에서 가능한 후보군으로 가지를 치며 탐색하는 알고리즘
분할 정복을 이용. 재귀함수를 이용하여 해를 찾아가는 도중 해가 되지 않는 경로가 있다면 더 이상 가지 않고 되돌아간다.
N Queen 대표적인 백트래킹 문제
N*N 체스판에 N개의 퀸을 서로 공격할 수 없도록 배치
[절차]
3. 방문한 노드의 하위 노드로 이동 후 재귀를 통해 DFS 수행
4. 백트래킹 수행
방문한 노드를 Pruning하고 상위 노드로 백트래킹 후 다시 DFS 수행
n=int(input())
def is_available(candidate, current_col):
current_row = len(candidate)
for queen_row in range(current_row):
if candidate[queen_row] == current_col or abs(candidate[queen_row] - current_col) == current_row - queen_row:
# 수직 체크 : 같은 열에 있는지 없는지 / 대각선 체크 : 열 차이와 행 차이가 같으면 대각선에 위치한 것임
return False
return True
def DFS(N, current_row, current_candidate, final_result):
if current_row == N: # n 행에 모든 queen을 찾았을 때
final_result.append(current_candidate[:]) # [:] 얕은 복사
return
for candidate_col in range(N):
if is_available(current_candidate, candidate_col): # 현재 행의 한 칸이 괜찮은지
current_candidate.append(candidate_col) # 괜찮으므로 후보에 추가하고
DFS(N, current_row + 1, current_candidate, final_result) # 다음 행으로 넘어가기
current_candidate.pop() # 방금 후보 지우기
def solve_n_queens(N):
final_result = []
DFS(N, 0, [], final_result)
return len(final_result)
print(solve_n_queens(n))
[참고]