[백준/파이썬] 9663번 풀이

업데이트:



문제 정보


풀이

문제

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

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

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

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

코드

n = int(input())
answer = 0

def bt(n, i, placable):
    print('================')
    print(i)
    for row in placable: print(row)
    print('================')
    if i >= n*n: return 1
    
    tmp = []
    if placable[i // n][i % n]:
        global answer
        answer += 1
        
        for row in placable: tmp.append(row.copy())
        for j in range(n): tmp[i // n][j] = tmp[j][i % n] = False
        j = 1
        while 0 <= i // n - j < n and 0 <= i % n - j < n:
            tmp[i // n - j][i % n - j] = False
            j += 1
        j = 1
        while 0 <= i // n + j < n and 0 <= i % n - j < n:
            tmp[i // n + j][i % n - j] = False
            j += 1
        j = 1
        while 0 <= i // n - j < n and 0 <= i % n + j < n:
            tmp[i // n - j][i % n + j] = False
            j += 1
        j = 1
        while 0 <= i // n + j < n and 0 <= i % n + j < n:
            tmp[i // n + j][i % n + j] = False
            j += 1
        
    i += 1
    while i < n*n and not placable[i // n][i % n]: i += 1
    if not tmp:  bt(n, i, tmp)
    bt(n, i, placable)

bt(n, 0, [[True] * n for _ in range(n)])
print(answer)

설명

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

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.를 만족하도록 로직을 구성하는 것입니다.

코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.

경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.



이런 주제는 어떠신가요?

비슷한 난이도와 유형의 문제를 이어서 보면 풀이 감각을 더 빠르게 잡기 좋습니다.

댓글남기기