여름의 서재
[SWEA] 2806_N-Queen 본문
728x90
📕 문제
💡 풀이법
1. dfs함수에서 r은 현재 행의 위치, queens는 현재까지 퀸을 둔 열의 리스트이다.
2. is_available함수는 지금 선택한 열(candidate)에 퀸을 위치시켰을 때 현재 퀸이 이전에 둔 퀸에게 공격을 받는지 안받는지를 판별하는 함수이다.
3. 0행일때는 이전에 둔 퀸이 없기 때문에 모든 열에 대해 dfs 함수가 실행이 된다.
(이때, r은 +1을 하면서 dfs를 실행한다.)
4. 퀸을 둔 열을 queens라는 리스트에 계속 추가해나간다.
5. 1행부터는 이전에 둔 퀸의 위치가 queens에 저장이 되어있기 때문에 비교하면서 둘 수 있는 열에 대해서만 dfs를 실행한다.
(이때, r은 +1을 하면서 dfs를 실행한다.)
6. r이 N이면 모든 행에 퀸을 둔 상태라는 뜻이므로 이때는 경우의수(ans)를 +1 해준다.
def is_available(candidate, row, col):
for i in range(len(candidate)):
if candidate[i] == col or abs(candidate[i] - col) == row - i:
return False
return True
def dfs(r, queens):
global ans
if r == N:
ans += 1
return
for i in range(N):
if is_available(queens, r, i):
queens.append(i)
dfs(r+1, queens)
queens.pop()
T = int(input())
for tc in range(1, T+1):
N = int(input())
ans = 0
dfs(0, [])
print('#{} {}'.format(tc, ans))
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA] 5189_전자카트 (0) | 2021.10.05 |
---|---|
[SWEA] 5188_최소합 (0) | 2021.10.05 |
[SWEA] 1242_암호 코드 스캔 (0) | 2021.09.30 |
[SWEA] 1240_단순 2진 암호코드 (0) | 2021.09.30 |
[SWEA]1232_사칙연산 (0) | 2021.09.24 |
Comments