๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/DFS BFS

[Python] ๋ฐฑ์ค€ 9663 N-Queen

by JayAlex07 2023. 4. 5.

๐Ÿง‘‍๐Ÿ’ป [Python] ๋ฐฑ์ค€ 9663 N-Queen

Gold 4 - Backtracking

img

Queen์€ ์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ, ๋Œ€๊ฐ์„ , 8 ๋ฐฉ๋ฉด ๋ชจ๋‘ ๊ณต๊ฒฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค

N์ด ์ฃผ์–ด์ง€๊ณ , ์ฒด์ŠคํŒ ์‚ฌ์ด์ฆˆ๋Š” N x N ์ด๊ณ , N ๊ฐœ์˜ Queen์„ ๋„ฃ์—ˆ์„ ๋•Œ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๋Š” ๋•Œ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ

1์ฐจ์ ์œผ๋กœ ์ž์„ธํžˆ ๋ณด๋ฉด, ๊ฐ ํ–‰๊ณผ ์—ด๋งˆ๋‹ค, Queen์€ ํ•˜๋‚˜์”ฉ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์ด ๋œป์€ ๊ตณ์ด ์ฒด์ŠคํŒ ์ž์ฒด๋ฅผ ์•ˆ ๋งŒ๋“ค์–ด๋„ ๋œ๋‹ค
  • board = [0, 3, 1, 4, 2]
    • ์•„๋ž˜ ์‚ฌ์ง„์„ ํ‘œํ˜„ํ•œ ๋ฆฌ์ŠคํŠธ (board์˜ ์ธ๋ฑ์Šค๊ฐ€ ์—ด/row, board์˜ ๊ฐ’์ด ํ–‰/column)
    • board ์•ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค์€ ๋ชจ๋‘ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค
row (board์˜ ์ธ๋ฑ์Šค) column (board์˜ ๊ฐ’)
0 0
1 3
2 1
3 4
4 2

 

 

๊ทธ ๋‹ค์Œ์—๋Š” ๊ฐ Queen๋“ค๋ผ๋ฆฌ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๊ฐ์„  ๊ฒฝ๋กœ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค

  • Queen์ด ๊ฐ™์€ ๋Œ€๊ฐ์„  ์ƒ์— ์žˆ์„ ๊ฒฝ์šฐ, row์™€ column์„ ๋นผ๋ฉด, ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค
  • ์ฆ‰ Queen์ด ๊ฐ™์€ ๋Œ€๊ฐ์„  ์ƒ์— ์œ„์น˜ํ•˜์ง€ ์•Š๋„๋ก, row์™€ column์„ ๋บ์„ ๋•Œ์—, ๋‹ค๋ฅธ ๊ฐ’์ด ๋‚˜์˜ค๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค

 

์ฝ”๋“œ

N = int(input())

board = [0] * N
result = 0

def is_possible(c):

    for column in range(c):
        if board[c] == board[column] or abs(c - column) == abs(board[c] - board[column]):
            return False

    return True


def backtracking(start):

    global result

    if start == N:
        result += 1
        print(board)
        return

    for column in range(N):

        board[start] = column

        if is_possible(start):
            backtracking(start + 1)    


backtracking(0)

print(result)