백트래킹(Backtracking) vs 깊이 우선 탐색
checknode(node v)
if promising(v):
if there is a solution at v
write the solution
else
for each child u of v
checknode(u)
체스판을 배열로 표시해보면
0번째 행 -> 2번째 열
1번째 행 -> 0번째 열
2번째 행 -> 3번째 열
3번째 행 -> 1번째 열
이므로 [2, 0, 3, 1]
로 표현할 수 있다.
이와 같은 방식으로 표현한다고 했을 때
배열 안에 같은 수가 들어간다면 같은 열에 있다는 뜻이므로, 모두 다른 수가 들어가야 한다. (ex. [2, 0, 2, 1]은 불가능)
행 번호의 차이가 열 번호의 차이와 같다면 같은 대각선 상에 있다는 뜻이므로, 유망하지 않다. (ex. [2, 0, 1, 3]에서 (1, 0)과 (2, 1)은 같은 대각선에 있으므로 불가능)
이 솔루션을 바탕으로 코드를 작성하면,
def nqueen(queen, n, row):
count = 0
if n == row:
return 1
# 가로로 한번만 진행
for col in range(n):
queen[row] = col
# 앞의 것과 비교
for x in range(row):
if queen[x] == queen[row]:
break
if abs(queen[x]-queen[row]) == row-x:
break
else:
count += nqueen(queen, n, row+1)
return count
def solution(n):
queen = [0] * n
return nqueen(queen, n, 0)