백트래킹

류기탁·2021년 12월 6일
0

CodingTest/Algorithm

목록 보기
7/22

백트래킹

전부확인하지만, 조건을 두어서 확인을 최소화 하는 기법

개요

  • 퇴각 검색 / 역추적
  • 모든 조합을 시도해서 문제의 해를 찾는다.
  • 해를 얻을 때 까지 모든 가능성을 시도한다.
  • 모든 가능성은 하나의 트리처럼 구성할 수 있으며, 가지(선택지)중에 해결책이 있다. 이 가지를 상태공간트리라고 한다.
  • 여러가지 선택지들이 존재하는 상황에서 하나의 집합이 생성된다.
  • 이런 선택을 반복하면서 최종 상태에 도달한다.
  • 보통 재귀함수로 구현된다.
  • 그러나 이 방법을 사용하면 가능성이 없는 노드의 후손 노드 까지 검색하기 때문에 비효율적이다.

특징 - 유망하다(promising)

  • 모든 후보를 검사하지 않는다.
  • 어떤 노드의 유망성을 점검한 후, 유망하지 않으면 그 노드의 부모로 되돌아가서 다음 자식 노드로 간다.
  • 유망하다 -> 어떤 노드를 방문했을 때 그 경로가 해답일 가능성이 있다.
  • 가지치기(pruning) -> 유망하지 않은 노드가 포함되는 경로는 더이상 고려하지 않는다.

완전탐색(DFS)와의 차이

  • 어떤 노드에서 출발하는 경로가 해답일 가능성이 없을때, 그 경로를 따라가지 않는다.
  • 상태에 조건을 주면서 해보는 것이다.
  • 즉, 불필요한 경로를 조기에 차단하는 것이다.
  • 하지만 최악의 경우에는 처리가 불가능 할 수 있다.

절차

  • 상태 공간 트리의 깊이우선검색(DFS)를 실행한다.
  • 유망한지 점검한다.
  • 유망하지 않으면, 부모노드로 돌아가서 다른 노드의 검색을 계속한다.

알고리즘

backtrack (node v)
    if promising v == false then return;
    if there is a solution at v -> solution
    else 
        for each child u of v
            backtrack( u )

백트래킹 예시

당첨 리프노드 찾기

  • 루트에서 갈 수 있는 노드를 선택한다.
  • 꽝 노드 까지 전달하면 최근 선택으로 되돌아와서 다시 시작한다.
  • 더 이상의 선택지가 없다면 이전 선택지로 돌아가서 다른 선택을한다.
  • 루트까지 돌아갔을 경우 더이상 선택지가 없다면 찾는답이 없다.

8-Queens 문제

  • 퀸 8개를 8개의 체스판 안에서 서로를 공격할 수 없도록 배치하는 모든 경우를 구하는 문제이다.
  • 후보는 64C8로, 4,426,165,368(44억)개가 있다.
  • 44억 개의 후보 중에서 92개를 효율적으로 찾아내야한다.

부분집합의 합 문제

  • 백트래킹 조건 : 집합이 모두 자연수 / 더한 값이 특정한 경우
  • 유한개의 정수로 이루어진 집합이 있을 때, 부분집합의 원소를 모두 더한 값이 0 이되는 경우를 찾기 : 이때는 불가하다.
profile
오늘도 행복한 하루!

0개의 댓글