[백준/Python] 9663 NQueen

알고리즘 - 백트래킹

Posted by Kyun2da on August 10, 2020

1️⃣서론

백준 문제 9663번 N-Queen 입니다. 파이썬(Python)으로 풀었습니다.

2️⃣문제 설명

이 문제는 N * N 의 체스판 위에 퀸 N개를 서로 공격할수 없게 놓는 문제입니다.
보통 N-Queen 문제는 대표적인 백트래킹 문제로 유명하기도 합니다.
혹시 백트래킹을 처음들어본다면 제가 개념을 정리해놓은 곳을 가보시면 될 것 같습니다.

3️⃣풀이

퀸을 한줄씩 놓으면서 답을 찾습니다. 백트래킹 방법으로 수행을 하면 됩니다.
퀸과 퀸이 겹치는 경우는 다음과 같습니다.

  1. 퀸이 같은 가로줄에 있을때
  2. 퀸이 같은 세로줄에 있을때
  3. 퀸이 같은 대각선에 있을때

이 경우를 피해서 DFS로 탐색하며 경우의 수를 찾습니다.
그림을 보면 다음과 같이 찾으면 됩니다.
백트래킹 이를 코드로 나타내면 아래와 같습니다.

4️⃣ 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys

n = int(sys.stdin.readline())

def dfs(arr):
    global ans
    length = len(arr)
    if length==n:
        ans+=1
        return
    candidate = list(range(n)) # 후보가 될 수 있는 자리를 0부터 n-1까지 만들고 제외하는 방법을 사용
    for i in range(length):
        if arr[i] in candidate:  # 같은 가로줄에 있으면 후보에서 제외
            candidate.remove(arr[i])
        distance = length - i
        if arr[i] + distance in candidate:  # 같은 '/' 대각선에 있으면 후보에서 제외
            candidate.remove(arr[i] + distance)
        if arr[i] - distance in candidate:  # 같은 '\' 대각선에 있으면 후보에서 제외
            candidate.remove(arr[i] - distance)
    if candidate:
        for i in candidate:
            arr.append(i)
            dfs(arr)
            arr.pop()
    else:
        return

ans = 0
for i in range(n):
    dfs([i])
print(ans)

5️⃣ 마치며..

질문과 지적은 환영합니다. 이 문제는 최적의 정답일 수도 아닐수도 있습니다.
궁금한게 있으시면 아래 댓글 남겨주세요.🙏
댓글은 저에게 큰 힘이 됩니다!
감사합니다. ❤️