백 트래킹 (bakctracking)

  • 제약 조건 만족 문제에서 해를 찾기 위한 전략
    • 해를 찾기 위해, 후보군에 제약 조건을 점진적으로 체크하다가, 해당 후보군이 제약 조건을 만족할 수 없다고 판단한 즉시 backtrack (다시는 이 후보군을 체크하지 않을 것을 표기)하고, 바로 다음 후보군으로 넘어가, 최적의 해를 찾는 방법
  • 실제 구현시, 고려할 수 있는 모든 경우의 수(후보군)을 상태공간트리(State Space Tree)를 통해 표현
    • 각 후보군을 DFS 방식으로 확인
    • 상태 공간 트리를 탐색하면서, 제약 조건에 맞지 않으면 해의 후보가 될만한 곳으로 바로 넘어가서 탐색
      • Promising : 해당 루트가 조건에 맞는지를 검사하는 기법
      • Pruning (가지치기) : 조건에 맞지 않으면 포기하고 다른 루트로 돌아가서, 탐색의 시간을 절약하는 기법

즉, 백트래킹은 트리 구조를 기반으로 DFS로 깊이 탐색을 진행하며, 각 루트에 대해 조건에 부합하는지 체크(Promising)하고, 만약 해당 서브트리에서 조건에 맞지 않는 노드는 더 이상 DFS로 깊이 탐색을 진행하지 않고, 가지를 치는 것(Pruning)

상태 공간 트리(State Space Tree)

문제 해결 과정의 중간 상태를 각각의 노드로 나타낸 트리

N Queen

  • 대표적인 백트래킹 문제
  • NxN 크기의 체스판에 N개의 퀸을 서로 공격할 수 없도록 배치하는 문제
  • 퀸은 수직, 수평, 대각선 이동(공격) 가능, 따라서 다음과 같이 배치해야 한다
    N Queen

Pruning for N Queen

  • 한 행에는 하나의 퀸만 위치 가능
  • 맨 위 행부터 퀸 배치, 그리고 다음 행에 퀸이 위치 가능한 곳 찾아 퀸 배치
  • 만약, 앞선 행의 퀸으로 인해, 다음 행에 퀸이 가능한 위치가 없을 경우, 이전 행의 퀸 배치를 바꿈
    • 맨 위 행부터 퀸 배치가 가능한 경우의 수를 상태 공간 트리로 만든 후, 맨 위 행부터 DFS로 접근

Promising for N Queen

  • 수직 체크 cur_col-queen_col==0
  • 대각선 체크 abs(queen_col-cur_col)==cur_row-queen_row
def is_available(candidate, cur_col):
    cur_row = len(candidate)
    for queen_row in range(cur_row):
        if candidate[queen_row] == cur_col or abs(candidate[queen_row]-cur_col) == cur_row - queen_row:
            return False
    return True

def DFS(N, cur_row, cur_queens, final_result): # cur_queens : 지금까지 배치된 퀸의 정보
    if cur_row == N:
        final_result.append(cur_queens[:]) # [:] == shallow copy
        return 
    for checking_col in range(N):
        if is_available(cur_queens, checking_col):
            cur_queens.append(checking_col)
            DFS(N, cur_row+1, cur_queens, final_result)
            cur_queens.pop()

def solve_n_queens(N):
    final_result = []
    DFS(N, 0, [],final_result)
    return final_result

'코딩테스트' 카테고리의 다른 글

알고리즘 풀이 블로그  (0) 2020.07.15
코딩인터뷰완전분석 - 알고리즘 설계의 5가지 접근법  (0) 2020.06.12
DFS, BFS  (0) 2020.01.23
DP  (0) 2020.01.17
코테 에러 분석  (0) 2020.01.07

+ Recent posts