N-Queens 문제란, N x N 크기의 체스판에 N개의 퀸을 서로 공격하지 않도록 놓는 문제입니다. 여기서 퀸은 가로, 세로, 대각선 방향으로 모두 공격이 가능합니다.
백트래킹 알고리즘을 사용하여 문제를 해결했습니다.
백트래킹 알고리즘은 완전탐색을 기반으로 하는 알고리즘으로, 해를 찾기 위해 모든 경우의 수를 탐색하면서, 현재 경로가 해가 될 가능성이 없다고 판단되면 이전 단계로 돌아가 다른 경로를 탐색하는 방법입니다. 즉, 현재 경로에서 더 이상 해를 찾을 수 없다고 판단되면, 이전 단계로 돌아가서 다른 가능성 있는 경로를 찾습니다.
백트래킹 알고리즘은 주로 조합, 순열, 그래프 탐색, 제약 충족 문제등의 문제에서 사용됩니다.
백트래킹 알고리즘의 장점은 모든 경우의 수를 검사하므로 해가 반드시 존재할 때 정확한 해를 찾아낼 수 있다는 것입니다. 또한, 상황에 따라 최적의 결과를 찾을 수 있는 경우도 있습니다.
하지만, 경우의 수가 많을 경우에는 많은 시간이 소요될 수 있다는 단점이 있스니다. 따라서, 백트래킹 알고리즘을 사용할 때는 가능한 모든 경우의 수를 탐색하지 않고, 불필요한 경우의 수를 배제하는 등의 최적화 기법을 사용하여 실행 시간을 단축시켜야 합니다.
def promising(i, j):![](https://velog.velcdn.com/images/123xxx/post/1cf4b4eb-e8f1-406b-a8b6-de4f42eeb366/image.jpg)
for di, dj in [[-1, -1], [-1, 0], [-1, 1]]:
ni, nj = i+di, j+dj
while 0 <= ni < N and 0 <= nj < N:
if board[ni][nj]: # 다른 퀸이 있으면
return 0 # 실패!
ni, nj = ni+di, nj+dj
return 1 # i, j에 퀸을 놓을 수 있음
def f(i, N):
global cnt
if i == N: # N개의 퀸을 놓은 경우
cnt += 1
else:
for j in range(N):
if promising(i, j):
board[i][j] = 1
f(i+1, N)
board[i][j] = 0
T = int(input())
for tc in range(1, T+1):
N = int(input())
board = [[0]*N for _ in range(N)]
cnt = 0
f(0, N)
print(f'#{tc} {cnt}')