코딩테스트 대비/BOJ

[Baekjoon/Python] 9663번: N-Queen - 효과는 굉장했다!

bluetag_boy 2022. 5. 26. 02:37
반응형
 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

알고리즘 분류

  • 브루트포스 알고리즘
  • 백트래킹

 

 

SOLUTION

import sys

def check(x): # 윗줄의 퀸의 라인과 겹치는지 확인하는 함수
    for i in range(x):
        # 같은 열인지 or 대각선에 퀸이 위치하는지 판단
        if chess[x] == chess[i] or abs(chess[x] - chess[i]) == x - i: 
            return False
        
    return True 


def dfs(x):
    global cnt

    if x == N:
        cnt += 1

    else:
        for i in range(N): # 열마다 퀸을 놓으면서 확인한다
            chess[x] = i # x열 i칸에 퀸을 놓는다
            
            if check(x):
                dfs(x+1) # 다음 행으로 이동


N = int(sys.stdin.readline())
chess = [0 for i in range(16)] # 1 <= N <= 15
cnt = 0
dfs(0)
print(cnt)