본문 바로가기
코딩테스트/파이썬

[백준] [백트래킹] N-Queen 9663 (파이썬)

by 커피는아아 2021. 3. 17.
반응형

문제 접근

 

[알고리즘] 백트래킹

백트래킹 DFS (재귀) + 가지치기 (break or continue) 모든 경우의 수를 탐색하는 DFS의 기본개념과 다르게 DFS이면서 break나 continue등으로 가지치기를 해서 경우의 수를 줄이면 백트래킹이라고 한다. 대

seongbindb.tistory.com

코드

# N - Queen
# 참조 코딩랩
import sys
input = sys.stdin.readline

def queen(row, col):
    
    for i in range(row):
        # 직선 겹칩
        # 행겹침, 열겹침
        if row == v[i][0] or col == v[i][1]:
        #if row == vx[i] or col == vy[i]:
            return 0
        # 대각선 겹침
        if abs(v[i][0]- row) == abs(v[i][1] - col):
        #if abs(row - vx[i] == abs(col - vy[i])):
            return 0

    # 나는 row 번째 행에서 체스 말을 (row,col)에 놓았다
    v[row][0] = row
    v[row][1] = col

    # 종료조건
    if row == n-1:
        # 행이 마지막에 간다면 탐색완료
        # print(v) 행에서 퀸이 놓인 위치를 알고 싶다면 이부분에서 프린트하면 된다.
        return 1

    result = 0
    for j in range(n):
        result += queen(row + 1, j) # 행을 증가시켜서 그다음 행을 탐색한다.
        
    return result


n = int(input())
v = [ [0,0] for _ in range(n) ]

answer = 0
for i in range(n):
   answer += queen(0,i) # 0행 i열마다 DFS를 실행한 결과값들 즉 n queen을 만족하는 경우의수
print(answer)