STUDY/Algorithm

[백준] 9663 N-Queen

sinawi95 2021. 3. 10. 09:03
728x90

https://acmicpc.net/problem/9663 

 

9663번: N-Queen

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

www.acmicpc.net

n = int(input())

matrix = [[0] * n for _ in range(n)]
result = 0
# 1: 퀸, 0: 놓을수 있는 자리, -1: 놓을수 없는 자리
def backtrack(index, arr=[]):
    if index == n:
        global result
        result += 1

    else:
        for i in range(n): # 한줄에서 하나씩만 보면 됨
            if i in arr: continue
            if matrix[index][i]: continue # 0이 아니면 넘어감
            if check_queen(index, i): continue
            matrix[index][i] = 1
            backtrack(index + 1, arr + [i])
            matrix[index][i] = 0

def check_queen(x, y):
    dx = [-1, -1] #대각선 방향만 확인
    dy = [-1, 1]
    for i in range(2):
        nx = x + dx[i]
        ny = y + dy[i]
        while 0 <= nx < n and 0 <= ny < n:
            if matrix[nx][ny] == 1:
                return 1
            nx += dx[i]
            ny += dy[i]
    return 0

backtrack(0)
print(result)

이또한 pypy에서만 통과가 되었다....

시간초과가 계속 나는걸 보고있자니 내가 알고리즘을 너무 못하는게 아닌가 싶다.

백트래킹 방식을 사용하되 반복문을 더 많이 사용해봐야하나?

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

[백준, SWEA] BOJ 14889 스타트와 링크, swea4012 요리사  (0) 2021.03.10
[백준] 14888 연산자 끼워넣기  (0) 2021.03.10
[백준] 2580 스도쿠  (0) 2021.03.09
[백준] 2589 보물섬  (0) 2021.03.08
[백준] 2468 안전영역  (0) 2021.03.06