NxN 체스판에 N개의 퀸을 서로 잡을 수 없는 위치에 배치할 수 있는 경우의 수를 구하면 되는 문제
NxN 매트릭스를 재귀하는 방법으로 구현하면 계속해서 시간 초과가 발생하게 된다.
힌트를 참고했다.
|현재 인덱스 - 비교 인덱스| == |현재 인덱스의 값 - 비교 인덱스의 값| 을 검사하면 된다.import sys
input = sys.stdin.readline
def check_condition(row_idx: int) -> bool:
'''
퀸이 같은 열에 있는지 or 대각선 상에 배치되었는지 검사한다.
'''
for comp_idx in range(row_idx): # 현재 row_idx 행까지 퀸이 배치되어 있음
# 비교 과정 20행 부터 참고
if matrix[row_idx]==matrix[comp_idx] or abs(row_idx-comp_idx)==abs(matrix[row_idx]-matrix[comp_idx]):
return False
return True
def recur(row_idx: int) -> None:
'''
재귀에 활용할 함수, 인자로 받은 row_idx 행에 col 값을 넣어보며 조건 검사에 만족하는 경우 퀸을 배치한다.
'''
global result
if row_idx == N: # N-1행까지 퀸이 배치 완료된 경우
result += 1 # 카운트 후 함수 종료
return
for col in range(N): # row_idx행의 모든 컬럼에 퀸 배치해보기
matrix[row_idx] = col # 일단 배치 후
if check_condition(row_idx): # 조건에 만족하면
recur(row_idx+1) # 퀸을 배치 후 다음 row_idx+1행 탐색
N = int(input())
result = 0
matrix = [-1 for _ in range(N)] # 문제 특성상 이와 같은 체스판 구성 가능, 16행 부터 참고
recur(0)
print(result)
🙏 문제 접근 방법 및 코드에 대한 피드백과 질문은 환영입니다!
본 문제의 다른 풀이 및 피드백, 전체 문제 풀이 순서는 위 알고리즘 스터디 Repository에서도 확인 가능합니다.