[알고리즘] N-Queen

난이도

Gold 4

문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

예제 입력

8

예제 출력

92

해설

유명한 N-Queen문제이다. 처음에는 무턱대고 이차원 배열로 체스판을 만들어 퀸을 놓을때마다 판을 바꾸고 이에 따라 백트래킹하는 방식을 생각했었는데, 이내 이 방식이 상당히 비효율적임을 깨닫게 되었다. 많은 해설에서 다루듯, 일차원 배열만을 사용해 N-Queen문제의 배치를 구현할 수 있었고 이를 이용해 백트래킹한다.

제출 코드

import time
start_time = time.time()

n = int(input())
cnt = 0

def dfs(lst, visit):
    global cnt
    now = len(lst) #새로 추가할 행 번호
    if(now == n):
        cnt += 1
        return
    
    banned = visit[:]#다음으로 선택할 수 없는 것
    for i in range(now):
        a = now-i+lst[i]
        b = i+lst[i]-now
        for j in [a,b]:
            if(j>=0 and j<n):
                banned[j] = 1

    for i in range(n):
        if(banned[i] == 0):
            nextVis = visit[:]
            nextVis[i] = 1
            dfs(lst+[i], nextVis)
    return

dfs([],[0 for i in range(n)])
print(cnt)

end_time = time.time()
execution_time = end_time - start_time

#print(f"Execution time: {execution_time} seconds")