문제 링크: https://www.acmicpc.net/problem/9663
퀸은 위 사진과 같은 열 또는 같은 행으로 체스판의 끝까지, 대각선 방향으로 체스판의 끝까지 이동이 가능하다. 그러므로 서로 공격할 수 없도록 퀸을 놓기 위해서는 빨간색으로 표시되지 않은 칸에 퀸을 두어야 한다.크기가 N*N인 체스판 위에 퀸 N개를 서로 공격할 수 없도록 퀸을 놓는 방법의 수를 구하자
아래와 같이 4 X 4 보드가 있다고 가정하고 4개의 퀸을 서로 공격할 수 없도록 배치해보자.
→ 퀸을 4개 놓는 것이 불가능
→ 서로 공격하지 못하도록 퀸을 4개 배치하는 것에 성공! 경우의 수를 1 증가시킨다
인덱스를 행 번호, 값을 열 번호
로 사용하여 문제를 풀 수 있다.[0, 2, 1, -]
(마지막 행에는 퀸을 둘 수 없기 때문에 '-'로 표시하였다)[1, 3, 0, 2]
열 번호의 차이 == 행 번호의 차이
import sys
input = sys.stdin.readline
n = int(input())
readline()
함수를 사용queen_col = [0 for _ in range(n)] # 퀸의 위치를 나타내는 배열
count = 0 # 경우의 수
열 번호의 차이가 행 번호의 차이
def promising(row):
for i in range(row):
if queen_col[row] == queen_col[i] or abs(queen_col[row] - queen_col[i]) == row - i:
return False
return True
global
키워드를 사용하여 내부에서 전역 변수를 사용def nqueen(row):
if row == n: # 마지막 줄까지 탐색 완료
global count
count += 1
return
for col in range(n):
queen_col[row] = col # (row, col)에 퀸을 놓는다
if promising(row): # 다음 줄에 퀸을 놓을 수 있다면
nqueen(row+1) # nqueen()을 호출하여 퀸을 놓는다
import sys
input = sys.stdin.readline
# 1. 입력
n = int(input())
# 2. 변수
queen_col = [0 for _ in range(n)] # 퀸의 위치를 나타내는 배열
count = 0 # 경우의 수
# 3. 다음 줄에 퀸을 둘 수 있을지 판단하는 함수
def promising(row):
for i in range(row):
if queen_col[row] == queen_col[i] or abs(queen_col[row] - queen_col[i]) == row - i:
return False
return True
# 4. 백트래킹
def nqueen(row):
if row == n:
global count
count += 1
return
for col in range(n):
queen_col[row] = col
if promising(row):
nqueen(row+1)
# 5. 위에서 구현한 함수를 호출하여 답을 구한다
nqueen(0)
print(count)