BOJ : 9663 N-Queen

김가영·2020년 10월 7일
0

Algorithm

목록 보기
6/78
post-thumbnail

python3 특성상 시간초과가 뜰 수 밖에 없고
pypy3로 제출해야.

대각선에 놓는 것은 점과 점을 연결한 기울기가 +1 또는 -1이면 대각선에서 만난다는 성질을 이용했다.

x 좌표는 0,1,2 차례로 늘어나게 했기 때문에 겹치는 것을 생각하지 않았고, y 좌표만 겹치는 지 체크.

arr 은 [1, 3, 2] 와 같은 형태로 queen의 y 좌표만 가지고 있는 리스트. x 좌표는 index 로 구분해줬다.

recursive 이용

def check(arr):
    x = len(arr)
    if x == n:
        global count
        count += 1
    else:
        for y in range(n):
            if y not in arr and check2(arr, x, y):
                check(arr + [y])


# 대각선으로 공격당하지 않는 지 확인 : arr 안의 점들과 새로운 점의 기울기가 +1 or -1 인지 확인하면 된다
def check2(array, x, y):
    for i,j in enumerate(array):
        if abs(y - j) == abs(x - i):
            return False
    return True


import sys
from collections import deque

n = int(sys.stdin.readline())

count = 0

check([])

print(count)

while 문

메모리 초과가 뜬다.
visit 에 너무 많은 요소가 들어가서인듯.

# 대각선으로 공격당하지 않는 지 확인 : arr 안의 점들과 새로운 점의 기울기가 +1 or -1 인지 확인하면 된다
def check2(array, x, y):
    for i, j in enumerate(array):
        if abs(y - j) == abs(x - i):
            return False
    return True


import sys
from collections import deque

n = int(sys.stdin.readline())

count = 0

visit = deque([])

for i in range(n):
    visit.append([i])

while visit:
    arr = visit.popleft()
    if len(arr) == n:
        count += 1
    else:
        x = len(arr)
        for y in range(n):
            if y not in arr and check2(arr, x, y):
                visit.append(arr + [y])

print(count)
profile
개발블로그

0개의 댓글