문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
예제 입력 1 복사
8
예제 출력 1 복사
92
어떤 문제인지는 앞으로 제목에 적어둘 예정이다.
*문제 해석
백트래킹하면 나오는 기본 문제인 N-Queen 문제다. 퀸이 서로를 공격할 수 없는 경우는 다음과 같다.
1. 행과 열마다 한개의 퀸만 존재한다.
2. 같은 대각선상에 퀸이 존재하지 않는다.
'1'을 풀기 위해서는 각 행들을 하나의 리스트로 하고 리스트 별로 인덱스가 겹치지 않게 퀸을 배치하는 식으로 하면 될 것이다.
'2'를 풀기 위해서는 퀸 간의 행과 열의 차이가 동일하지 않은 지를 판단해야한다. 동일하다면 정사각형 양 끝에 퀸이 위치했다는 것이고, 그 말은 둘은 대각선에 있는 것이기 때문이다.
*나의 코드
import sys
input = sys.stdin.readline
n = int(input())
# 퀸의 공격여부 확인
def attack(x):
for i in range(x):
# 같은 행에 퀸이있거나 대각선에 퀸이 있는 경우 : 1번 경우와 2번 경우
if row[x] == row[i] or abs(row[x] - row[i]) == abs(x - i):
return True
return False
def dfs(start):
global result
if start == n: # 마지막까지 탐색했을 경우
result += 1
else:
for i in range(n):
row[start] = i
if not attack(start): # 퀸의 위협을 받지 않는다면 다음 탐색
dfs(start + 1)
row = [0] * n # 체스판 생성
result = 0
dfs(0)
print(result)
* python3으로 풀이시 시간초과, pypy3사용할 것
*중요한 점
1. 백트래킹 문제 시간초과가 생길경우 pypy3로 컴파일 하기
2. 탐색문제에선 조건을 파악하고 정리하는 것이 중요하다.
'코딩테스트 > 백준' 카테고리의 다른 글
18. 백준 5639 (골드4) : 이진검색트리 _ python풀이 / 이진트리 (1) | 2024.09.01 |
---|---|
17. 백준 10158 (실버3) : 개미 _ python풀이 / 애드 혹 (0) | 2024.08.31 |
15. 백준 15686 (골드5) : 치킨배달 _ python풀이 (4) | 2024.08.30 |
14. 백준 2437 (골드2) : 저울 _ python풀이 (1) | 2024.08.28 |
13. 백준 1202 (골드2) : 보석 도둑 _ python풀이 (0) | 2024.08.27 |