Backtracking
답이 x1, x2, x3… 이런 형식으로 도출되는 문제에서, 유효한 답을 모두 찾는 경우 사용되는 알고리즘 기법
x1부터 차례대로 결정하면서 만약 어느 순간 조건에 맞는 답을 도출 못하는 상황에 마주하면,
그 전 단계로 돌아가 다른 선택지로 다시 답을 찾아가는 방법이다.
이 기법은 굳이 더 알아보지 않아도 되는 경우를 확인하지 않도록 설계하는 것이 가장 중요하다.
psuedo code
1 | def backtrack(k): |
이런 방식은 미로 탈출하기 등에 적용할 수 있다.
N queens 문제
n X n 체스판에 n개의 퀸을 배치해야 한다.
다만 각 퀸들의 공격권에 다른 퀸이 있으면 없도록 배치해야 할 때, 배치 가능한 방법 갯수를 구하라.
x라는 배열이 각 퀸의 위치를 인덱스가 행을, 밸류값을 열로 나타낸다.
이제 x[0] = 0은 (0,0)에 퀸이 존재함을 의미한다.
그러면 이제 backtracking을 위해 x[0] = 0 이라고 가정하자.
x[1]는 0과 1이 될 수 없다.(세로줄 겹침, 대각선 겹침.)
x[1] = 2인 경우는 일단 문제는 없으니 x[1] = 2 로 가정하고 넘어간다.
x[2] 는 이제 0, 1, 2, 3 모두 될 수 없다.(두 퀸과 무조건 겹침)
즉 조건을 만족할 수 없으므로, x[1]의 경우로 backtracking한다!
이런 과정을 통해 x[3]이 배치될 때까지 반복하면 backtracking을 통해 답을 찾을 수 있다.