Algorithm

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

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ N-Queen

๐Ÿ• ๋ฌธ์ œ

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N ร— N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿพ ํ’€์ด ๋ฐฉ๋ฒ•

n_queen ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ์—๋Š” ์—ด์„ ์ด์šฉํ•ด์„œ ์‹คํ–‰์‹œํ‚ค๊ณ , ๋“ค์–ด๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ๋ฅผ ํ–‰์œผ๋กœ ๋ฐฐ์ •ํ•˜์—ฌ ๊ฐ™์€ ์—ด์— ์žˆ๋Š” ๋…ธ๋“œ์™€ ๋Œ€๊ฐ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, n=4์ธ ๊ฒฝ์šฐ
0,1,2,3 ์ˆœ์œผ๋กœ n_queenํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.
์ด๋•Œ arr์— [0,1] ์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค๋ฉด, ์ด๋Š” (0,0), (1,1)์— ํ€ธ์ด ๋†“์—ฌ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
๋”ฐ๋ผ์„œ n_queen ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ฐ™์€ ์—ด์— ์œ„์น˜ ์ฆ‰, ํ˜„์žฌ arr๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์ด๋ฉด ์ œ์™ธํ•˜๊ณ  distance๋ฅผ ๊ตฌํ•ด์„œ ๋Œ€๊ฐ๋…ธ๋“œ๋„ ์ œ์™ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์†Œ์Šค์ฝ”๋“œ (Pypy3)

import sys

def n_queen(arr, n):
    global count
    if len(arr) == n:
        count += 1
        return
    candidate = list(range(n)) #n=4์ธ ๊ฒฝ์šฐ, candidate=[0,1,2,3]
    for i in range(len(arr)): #i๋Š” ์–ด์ฉŒ๋ฉด ํ–‰ ๋ฒˆํ˜ธ
        if arr[i] in candidate:
            candidate.remove(arr[i])
        dist = len(arr) - i
        # arr[i]๊ฐ€ ์•„๋‹Œ len(arr)๋กœ ํ•˜๋Š” ์ด์œ ๋Š”, ๋‹ค์Œ ์ฐจ๋ก€์— ๋“ค์–ด๊ฐˆ ์นธ์ด ํ˜„์žฌ ๋“ค์–ด๊ฐ€์žˆ๋Š” ํ–‰๊ธธ์ด ๋’ค์— ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฏ€๋กœ, ๋Œ€๊ฐ์„ ์˜ ์ฐจ๊ฐ€ ๊ทธ๋งŒํผ ๋‚˜์•ผํ•œ๋‹ค.
        # ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ˜„์žฌ (0,0)๋งŒ arr์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์— ๋†“์ผ ํ€ธ์€ 1ํ–‰์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ ๋Œ€๊ฐ์„ ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์€ (1,1)๋ฐ–์— ์—†์œผ๋ฏ€๋กœ dist=1
        # ํ˜„์žฌ (0,0) (1,2) ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” (0,0)์—์„œ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋„ ๋‹ค์Œ์— ๋†“์ผ ํ€ธ์€ 2ํ–‰์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ ๋Œ€๊ฐ์„ ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์€ (2,2) ์ด๋ฅด๋ชจ dist = 2 (len(arr)-i)
        if arr[i] + dist in candidate: #๊ฐ™์€ ๋Œ€๊ฐ์„ 
            candidate.remove(arr[i] + dist)
        if arr[i] - dist in candidate:
            candidate.remove(arr[i] - dist)
    if candidate:
        for c in candidate:
            arr.append(c)
            n_queen(arr,n)
            arr.pop()
    else:
        return

count = 0
n = int(sys.stdin.readline().strip())
for i in range(n):
    n_queen([i], n)
print(count)