Algorithm/BackTracking

[Python] SWEA 2806번 N-Queen

코딩쪼앙 2023. 5. 13. 16:29

문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제 풀이

  • 퀸이 같은 열, 행 대각선 내에 없도록 탐색을 진행해야 한다 <- 백트래킹 사용
  • 같은 대각선 내 (오른쪽)에 있을 때 행과 열의 인덱스를 더한 값이 같고, 왼쪽 대각선에 있을 때는 행과 열의 인덱스를 뺸 값이 같다.
    • 같은 열, 대각선 내에 있는지 빠르게 체크하기 위해 v1,v2,v3배열을 만들어, 접근하여 0이 저장되어 있다면, 같은 행이나 대각선에 퀸이 없는 것으로 퀸을 놓을 수 있는 경우로 보고, 1이 저장되어있다면, 퀸을 놓을 수 없는 경우로 본다.
  • 같은 열, 대각선의 인덱스 값이 0이라면 위에서 말한대로 퀸을 놓을 수 있으므로, 값을 1로 바꾸고, 재귀적으로, 현재 행 인덱스에 1을 더한 값을 넣어 다음 행의 가능한 경우를 탐색한다.
  • 위의 모든 과정을 반복한 후, 행이 N이라면 모든 행에 퀸이 겹치지 않게 놓은 경우이므로, 카운트 한 후, 종료한다.
  • 이 과정을 반복하면 ans에 총 몇가지 경우의 수가 있는지 저장 되어있으므로, 형식에 맞게 출력한다. 

코드

def dfs(i):
    global ans
    # i는 행의 인덱스
    if i == N:
        ans += 1
        return

    for j in range(N):
        # 같은 열, 오른쪽 대각선, 왼쪽대각선에 퀸이 없다면
        # 퀸 놓고 아래 행 탐색
        if v1[j] == v2[i + j] == v3[i - j] == 0:
            v1[j] = v2[i + j] = v3[i - j] = 1
            dfs(i + 1)
            # 놓은 퀸들 초기화
            v1[j] = v2[i + j] = v3[i - j] = 0

t = int(input())
for tc in range(t):
    N = int(input())
    ans = 0
    v1 = [0] * N
    v2 = [0] * (2 * N) # 대각선 왼쪽 아래에 있는지 탐색
    v3 = [0] * (2 * N) # 대각선 오른쪽 아래에 있는지 탐색
    dfs(0)
    print(f'#{tc + 1}', ans)

참고 자료

 

'Algorithm > BackTracking' 카테고리의 다른 글

[Python/C++] 백준 10819번 차이를 최대로  (3) 2025.01.13
[Python] 백준 12919 A와B 2  (8) 2024.09.22