(Python) 백준 9663번 N-Queen - class 4
[문제 링크]
9663번 N-Queen
백트래킹 문제인데 대각선과 위아래가 겹치지 않는지 한 번에 처리하는 것이 중요하다. 따라서 정사각 보드판의 특성을 알고 있어야 한다.
- 오른쪽 방향 대각선 : x - y 결과값이 같다면 같은 오른쪽 대각선 상
- 왼쪽 대각선 : x + y 결과값이 같다면 같은 왼쪽 대각선 상
- 같은 행 : 같은 x값
- 같은 열 : 같은 y값
문제 조건에서 N * N 보드판에 N개의 퀸을 놓는다고 했다. 퀸은 같은 행에 존재할 수 없기 때문에 모든 행에 1개씩 퀸을 놓아야 한다. 따라서 행을 인자로 넘기면서 설계하면 된다.
cf) 백트래킹 문제는 타 언어보다 느리다는 파이썬의 특성상 PyPy3를 사용 해야 한다. 그리고 여기서는 재귀의 깊이를 늘리면 메모리 초과가 발생한다.
def queen(i):
global ans
if i == n: # 마지막 행까지 도달
ans += 1
return
for j in range(n):
# 새로 설치가 가능한 경우
if column[j] == 0 and right[i - j] == 0 and left[i + j] == 0:
# 설치 작업
column[j] = 1
right[i - j] = 1
left[i + j] = 1
queen(i + 1) # 다음 행
# 설치 해제
column[j] = 0
right[i - j] = 0
left[i + j] = 0
n = int(input())
ans = 0
column = [0] * n
right = [0] * (n * 2 - 1)
left = [0] * (n * 2 - 1)
queen(0)
print(ans)