Algorithm/Programmers
[프로그래머스] N-Queen - Python
Dev.sohee
2022. 2. 7. 01:17
코딩테스트 연습 - N-Queen
가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은
programmers.co.kr
풀이
1. queen 배열
- ex) queen[1] = 2 -> 1행 2열에 퀸 배치
2. check 함수
- 퀸이 놓일 수 있는지 행, 열, 대각선 확인
- abs(x-i) == abs(queen[x] - queen[i]) : 대각선 방향 확인
- ex) [2, 3]의 대각선 방향 = [1, 2], [0, 1], [1, 4] / [2, 2]의 대각선 방향 = [1, 1], [0, 0], [3, 3] -> 규칙을 이용해서 식 구하기
=> 0행에 0~n-1열까지 순서대로 퀸을 놓으면서 경우의 수를 찾는다. dfs로 풀면서 안되는 경우에 해당하면 이전 단계로 돌아가는(가지치기) 백트래킹으로 해결할 수 있다.
def n_queen(n, x, queen):
result = 0
if x == n:
return 1
for i in range(n):
queen[x] = i
if check(x, queen):
result += n_queen(n, x+1, queen)
return result
def check(x, queen):
for i in range(x):
if queen[x] == queen[i] or abs(x-i) == abs(queen[x] - queen[i]):
return False
return True
def solution(n):
queen = [0] * n
answer = n_queen(n, 0, queen)
return answer