새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 9663 N-Queen

by 언호 2022. 1. 2.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

전형적인 N-Queen 문제로 완전 탐색, 백트래킹 사용

2) 알고리즘

  • 완전 탐색
  • 백트래킹

3) 풀이 코드

사용 언어 - Python

import sys


def chk(y, x):
    for i in range(1, y+1):         
        if x - i >= 0 and cols_selected[x] - i == cols_selected[x-i]:       # 현재 열의 행과 옆에 떨어진 열의 행이 같을때
           return False                                                     # 위로 올라갈수록 대각선에 퀸이 있을때
        elif x + i < N and cols_selected[x] - i == cols_selected[x+i]:
            return False
    return True

def solution(n):
    global answer

    if n >= N:              # 모든 행에 놓았으면 정답 개수 증가
        answer += 1
        return

    for c in range(N):
        if cols_selected[c] == -1:          # 열에 퀸이 놓여있지 않으면
            if chk(n, c):                   # 위에 행 중 대각선에 퀸이 없을때
                cols_selected[c] = n        # 지금 열에 행 번호 저장
                solution(n+1)               # 다음 행 탐색
                cols_selected[c] = -1

N = int(sys.stdin.readline())               # 체스판의 크기
cols_selected = [-1] * N                    # 열에 퀸이 놓였는지 유무 판별 및 몇번 행에 놓였는지 저장
answer = 0                                  # 정답을 저장할 변수

solution(0)                                 # 0번 행부터 시작

print(answer)                               # 출력

📝 결과 및 학습한 내용

1) 어려웠던 내용

Python 으로 제출시 시간초과가 발생

PyPy3 로 제출하여 통과, Python 으로 통과할 방법을 찾아보았지만 문제에서 N의 최댓값이 너무 커서 방안을 찾기 어려움

2) 새롭게 학습한 내용

시간초과를 해결하기 위해 많은 노력이 필요함


🔗 문제 링크

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

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 1504 특정한 최단 경로  (0) 2022.01.04
[백준] 1043 거짓말  (0) 2022.01.03
[백준] 1759 암호 만들기  (0) 2022.01.01
[백준] 10819 차이를 최대로  (0) 2021.12.31
[백준] 7662 이중 우선순위 큐  (0) 2021.12.30

댓글