체스판의 위치를 저장해놓을 때 이차원 배열로 할 수도 있지만 위와 같이 인덱스와 값을 이용해서 저장할 수도 있다.
💡 아이디어
- 각 열에 한 개씩만 말이 올라갈 수 있기 때문에 i열에 올라간 말의 행의 위치를 j로 설정하면 pos[i] = j 로 저장할 수 있다.
- set(i)에서 이미 열은 정해졌기 때문에 반복문을 통해 j를 설정한 후 조건문을 통해 해당 j행에 말이 있는지 확인하고 다시 조건문을 통해 대각선에 말이 있는지 abs_()를 통해서 확인한다.
- 대각선에 말이 있는지 확인하는 방법은 절대값을 이용해서 확인할 수 있다.
- i가 n-1이 되면 모든 열에 말을 놓았기 때문에 종료한다.
N = int(input())
pos = [0]*N
flag = [False]*N
answer = 0
# 출력
def abs_(i):
count = 0
if i == 0:
return True
else:
for k in range(i):
if abs(i - k) == abs(pos[i] - pos[k]):
break
else:
count += 1
continue
if count == i:
return True
else:
return False
# i열에 퀸을 배치
def set(i):
global answer
# i열 j행에 퀸을 배치
for j in range(N):
if not flag[j]:
pos[i] = j
if not abs_(i):
continue
# 종료조건
if i == N-1:
answer += 1
else:
flag[j] = True
# 다음 열의 퀸을 배치
set(i+1)
# flag를 False로 돌려놓지 않으면 01234567 한 가지 경우만 출력되고 flag가 모두 True여서 프로그램이 종료됨
# flag를 False로 돌려놔야 행, 열에 새로운 숫자가 들어갔을 때 다시 flag를 사용할 수 있음
flag[j] = False
set(0)
print(answer)