728x90

백준 9663 N-Queen문제이다.

 

전에 올린 백준 1799 비숍 문제와 유사하지만 조금 더 쉽다.

사용하는 방법은 백트래킹이다.

 

가로, 세로 한 줄에는 하나의 퀸 밖에 들어가지 못하니 한 줄을 기준으로 정하고 하나씩 더해주면 된다.(물론 불가능한 경우는 백트래킹으로 걸러주어야 한다.)

 

여기서는 가로로 한 줄씩 더해주었다.

이 문제에서 조금 귀찮은 부분은 대각선으로 불가능한 경우를 찾아서 제거해주는 것인데, abs(row[x]-row[i]) == abs(x - i)로 찾아주면 된다. (가로, 세로의 차이가 같다면 대각선에 있다)

 

최종코드는 

n = int(input())

ans = 0
row = [0] * n


def is_possible(x):
    for i in range(x):
        if row[x] == row[i] or abs(row[x] - row[i]) == abs(x - i):
            return False

    return True


def n_queens(x):
    global ans
    if x == n:
        ans += 1
        return

    else:
        for i in range(n):
            # [x, i]에 퀸을 놓겠다.
            row[x] = i
            if is_possible(x):
                n_queens(x + 1)


n_queens(0)
print(ans)

아쉽지만 pypy3로 제출할 수 있도록 하자.

'알고리즘 > 백트래킹' 카테고리의 다른 글

백준 1799 비숍  (0) 2022.09.05

+ Recent posts