[백준] 9663번 N-Queen 해설 및 풀이 (Python)

2025. 2. 27. 01:51·Study/코딩 테스트
반응형

백준 9663번 N-Queen

https://www.acmicpc.net/problem/9663

 


 

문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

 


 

문제 풀이

 

문제 유형

 

브루트포스 알고리즘

백트래킹

 

풀이 방법 도출

 

문제는 N x N 크기의 체스판에서 N개의 퀸을 서로 공격할 수 없도록 배치하는 방법의 수를 구하는 문제입니다.

퀸은 같은 행과 같은 열과 대각선 방향으로 공격할 수 있습니다.

 

퀸의 공격 방식은 아래와 같습니다.

 

  1. 같은 행에 놓을 수 없습니다.
  2. 같은 열에 놓을 수 없습니다.
  3. 왼쪽 대각선에 놓을 수 없습니다
  4. 오른쪽 대각선에 놓을 수 없습니다.

 

따라서 한 행에는 하나의 퀸만 놓을 수 있음을 활용하여 백트래킹을 수행합니다.

 

  1. 퀸을 배치할 때, 세 가지 조건을 배열을 사용합니다.
  2. 첫 번째로 같은 열에 사용되었는지 확인합니다.
  3. 두 번째로 왼쪽 대각선에 사용되었는지 확인합니다.
  4. 세 번째로 오른쪽 대각선에 사용되었는지 확인합니다.
  5. row == N이 되면 모든 행에 퀸을 배치한 것이므로 경우의 수 증가합니다.
  6. 퀸을 배치한 후, 다음 행으로 이동합니다.
  7. 백트래킹을 수행하여 퀸을 제거하고 다른 경우 탐색합니다.

시간 복잡도

  • O(N)

 


문제 풀이 핵심 코드

 

import sys


def n_queens(row):
    """
    백트래킹을 이용해 퀸을 배치하는 함수
    """
    global count
    if row == N:  # 모든 행에 퀸을 배치하면 경우의 수 증가
        count += 1
        return


    for col in range(N):  # 모든 열에 대해 퀸을 배치 시도
        if not col_used[col] and not diag1[row + col] and not diag2[row - col + (N - 1)]:  
            # 현재 위치에 퀸을 놓을 수 있는 경우
            col_used[col] = diag1[row + col] = diag2[row - col + (N - 1)] = True  # 퀸 배치
            n_queens(row + 1)  # 다음 행으로 이동
            col_used[col] = diag1[row + col] = diag2[row - col + (N - 1)] = False  # 백트래킹


N = int(sys.stdin.readline().strip())  # 입력 받기
col_used = [False] * N  # 열(column) 사용 여부 체크
diag1 = [False] * (2 * N - 1)  # 왼쪽 아래 대각선 체크
diag2 = [False] * (2 * N - 1)  # 오른쪽 아래 대각선 체크
count = 0  # 가능한 경우의 수 저장 변수


n_queens(0)  # 첫 번째 행부터 시작
print(count)  # 퀸을 놓는 방법의 수 출력

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Study > 코딩 테스트' 카테고리의 다른 글

[백준] 1874번 스택 수열 해설 및 풀이 (Python)  (0) 2025.02.27
[백준] 6064번 카잉 달력 해설 및 풀이 (Python)  (0) 2025.02.27
[백준] 1541번 잃어버린 괄호 해설 및 풀이 (Python)  (0) 2025.02.25
[백준] 1018번 체스판 다시 칠하기 해설 및 풀이 (Python)  (0) 2025.02.24
[백준] 20055번 컨베이어 벨트 위의 로봇 해설 및 풀이 (Python)  (0) 2025.02.23
'Study/코딩 테스트' 카테고리의 다른 글
  • [백준] 1874번 스택 수열 해설 및 풀이 (Python)
  • [백준] 6064번 카잉 달력 해설 및 풀이 (Python)
  • [백준] 1541번 잃어버린 괄호 해설 및 풀이 (Python)
  • [백준] 1018번 체스판 다시 칠하기 해설 및 풀이 (Python)
Dev Chu
Dev Chu
  • Dev Chu
    Log_Double 7
    Dev Chu
  • 전체
    오늘
    어제
    • LOG LIST (199)
      • log Double 7 (2)
        • notice (1)
        • 회고록 (1)
      • Study (111)
        • 과제 (2)
        • 코딩 테스트 (105)
        • 대규모 시스템 설계 기초 (4)
      • CS (10)
        • 자료구조 & 알고리즘 (4)
        • Design Pattern (2)
        • TIL (4)
      • FrontEnd (26)
        • HTML & CSS (16)
        • JavaScript & jQuery (9)
        • React (1)
      • BackEnd (24)
        • Java (4)
        • Python (6)
        • Database (0)
        • Spring (6)
      • Infra & DevOps (3)
        • AWS (3)
        • Git (8)
      • Project (3)
        • repo_bis (2)
        • WhiteMonday (1)
      • ETC (20)
        • TIP (13)
        • Error (5)
        • SQLD (2)
  • 블로그 메뉴

    • 코딩 테스트
  • 링크

    • GitHub
  • 공지사항

    • Log Double 7
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Dev Chu
[백준] 9663번 N-Queen 해설 및 풀이 (Python)
상단으로

티스토리툴바