문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
예제 입력 1
8
예제 출력 1
92
알고리즘 분류
ㆍ백트레킹
PyPy3 코드(시간초과)
n, ans = int(input()), 0
a, b, c = [False]*n, [False]*(2*n-1), [False]*(2*n-1) # a=수직, b=우상향대각선, c=좌상향대각선의 각각 가능한 칸수만큼
def solve(i):
global ans
if i == n: # 퀸을 다 놓았다면
ans += 1 # 경우의 수를 한개 추가
return # 종료
for j in range(n): # 열을 이동하면서
if not (a[j] or b[i+j] or c[i-j+n-1]): # 인덱스의 합과 차가 같다는 것을 이용, 세가지 조건에 부합하지 않는다면
a[j] = b[i+j] = c[i-j+n-1] = True # True 표시
solve(i+1) # 다음 퀸을 놓기 위해 재귀.
a[j] = b[i+j] = c[i-j+n-1] = False # 초기화
solve(0)
print(ans)
출처: https://rebas.kr/761 [PROJECT REBAS]
한동한 나를 알고리즘 문제에서 도망치게 한 문제.
지금까지의 백트레킹은 어떻게든 해내왔으나
시간초과와 대각선 구현 문제로 하루종일 끙끙대다 결국 GG.
정답을 찾아보니 느려터진 파이썬은
시간제한을 극복하면서 코드를 구하는게 꽤 어려운 듯.
제출도 Python3이 아닌 PyPy3으로 해야 시간초과가 나지 않는다.
그러다보니 난이도가 비약적으로 상승한게 없지않아 있다.
결론 : 인덱스의 합이 같은 경우 같은 대각선 상에 위치함을 참고할 것.
https://rebas.kr/761
'파이썬 > 알고리즘' 카테고리의 다른 글
백준 2908번 [Python] 문제풀이 (상수) - 이정개 (0) | 2021.07.08 |
---|---|
백준 1032번 [Python] 문제풀이(명령 프롬프트) - 이정개 (0) | 2021.07.05 |
백준 15649번 [Python] 문제풀이 (N과 M(1)) - 이정개 (0) | 2020.04.01 |
백준 1181번 [Python] 문제풀이 (단어 정렬) - 이정개 (0) | 2020.03.27 |
백준 2108번 [Python] 문제풀이 (통계학) - 이정개 (0) | 2020.03.27 |