[๋ฐฑ์ค€] [Python] ๐Ÿงฉ N-Queen (Easy) 30242๋ฒˆ

๐Ÿ’ก ๋ฌธ์ œ ์„ค๋ช…

๐Ÿงฉ N-Queen (Easy)

์ „์— ํ–ˆ๋˜ ๋ฌธ์ œ์™€ ๋‹ค๋ฅด๊ฒŒ, ์ด๋ฏธ ํ€ธ์ด ๋†“์—ฌ์ ธ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ํ•œ๋ฒˆ์˜ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ผ๋•Œ ํ€ธ๋“ค์˜ ์ž๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค.

์ „ํ˜•์ ์ธ ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๋กœ, ์ด ๋ฌธ์ œ๋„ ๊ผญ ํ’€์–ด๋ณด๋ฉด ์ข‹๋‹ค.


๐Ÿ’ก ๋А๋ฆฐ ํ’€์ด (ํ†ต๊ณผ๋Š” ๋ฐ›์Œ)

์ด ํ’€์ด๋ฒ•์€ ๋ณดํ†ต ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด n-queen์„ ํ‘ผ๋‹ค๋ฉด ํ‘ธ๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋Œ€์ž…์„ ํ•ด์ค€ ํ›„ checkํ• ๋•Œ๋งˆ๋‹ค ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ ์— ๊ฒน์น˜๋Š”๊ฒŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

์—ฌ๊ธฐ์„œ quit() ๋Š” ์•„์˜ˆ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œ์ผœ์ค€๋‹ค.

import sys


def q_check(x):
    # ์ด๋ฏธ ๊ธฐ๋ก๋œ 0 ~ N ๋ฒ”์œ„ ๋ณด๊ธฐ
    for i in range(N):

        # ๋ณธ์ธ ๋‹จ๊ณ„ ์ œ์™ธ
        if i==x:
            continue

        # ์•„์ง ์•ˆ์“ด๊ฑฐ๋Š” ๋Œ€๊ฐ์„  ์˜ํ–ฅ๊ฐˆ์ˆ˜์žˆ์œผ๋‹ˆ ์ œ์™ธ
        if row[i]==0:
            continue

        # row (๊ฐ€๋กœ)์ฒดํฌ
        # ์ฒดํฌํ•˜๋ ค๋Š” row == ๊ธฐ๋ก๋œ row(q_list[i]) ์ผ๋•Œ False
        if row[x] == row[i]:
            return False
        # ๋Œ€๊ฐ์„  ์ฒดํฌ
        # ์ฒดํฌํ•˜๋ ค๋Š” row ์™€ ์ด๋ฏธ ๊ธฐ๋ก๋œ row ์˜ ์ฐจ๊ฐ€
        # ์ฒดํฌํ•˜๋ ค๋Š” column ๊ณผ ๊ธฐ๋ก๋œ column ์˜ ์ฐจ๋ž‘ ๊ฐ™๋‹ค๋ฉด ๋Œ€๊ฐ์„ ์ด๋‹ˆ False
        if abs(row[x]-row[i]) == abs(x-i): # abs() = ์ ˆ๋Œ“๊ฐ’ ํ•จ์ˆ˜
            return False
    # ๋‘ ๊ฒฝ์šฐ ๋‹ค ํ”ผํ•ด๊ฐ€๋ฉด True
    return True


def n_queen(n):
    # ๋๊นŒ์ง€ ์™„์„ฑํ•œ ๊ฒฝ์šฐ
    if n==N:
        print(*row)
        quit() # ์•„์˜ˆ ์ข…๋ฃŒ

    # ์ด๋ฏธ ์จ์žˆ๋Š”๊ฒฝ์šฐ ๋ฐ”๋กœ ๋‹ค์Œ๋‹จ๊ณ„๋กœ
    if row[n]!=0:
        n_queen(n+1)
        return

    # 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋„ฃ์–ด๋ณด๊ธฐ
    for i in range(1,N+1):
        # ํ•ด๋‹น ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋งŒ ๋„ฃ๊ธฐ
        if visited[i] == False:
            temp = row[n]
            row[n] = i
            if q_check(n):
                visited[i]=True
                n_queen(n+1)
                visited[i]=False
            row[n] = temp

N = int(sys.stdin.readline())
row = list(map(int, sys.stdin.readline().split()))
visited = [False] * (N+1)

# ์ด๋ฏธ ๋†“์•„์ง„ ํ€ธ์˜ ๊ฐ’
for i in range(N):
    if row[i] != 0:
        visited[row[i]] = True

n_queen(0) # 0๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ ํ•จ์ˆ˜ ์‹คํ–‰
print(-1)


๐Ÿ’ก ๋” ๋น ๋ฅธ ํ’€์ด๋ฒ•

์ด์ „์˜ ๊ธ€์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ „์˜ ๊ธ€์„ ๋ณด์ง€ ์•Š์•˜๋‹ค๋ฉด ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€ ์„ค๋ช…์„ ๋ณด์ž.

import sys

def backtracking(n):

    # ๋‹ค ๋„๋‹ฌํ–ˆ์„ ๋•Œ
    if n==N:
        print(*arr)
        quit()

    # ์ด๋ฏธ ์จ์žˆ๋Š”๊ฒฝ์šฐ ๋ฐ”๋กœ ๋‹ค์Œ๋‹จ๊ณ„๋กœ
    if arr[n] != 0:
        backtracking(n + 1)
        return

    for i in range(N):
        # ๋†“์„ ์ˆ˜ ์žˆ์œผ๋ฉด
        if row[i] and x1[i+n] and x2[i+((N-1)-n)]:

            arr[n] = i+1
            row[i]=False # ๊ฐ€๋กœ์ค„ ์ œ๊ฑฐ
            x1[i+n]=False # ์˜ค๋ฅธ์ชฝ ์œ„ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„  ์ œ๊ฑฐ
            x2[i+((N-1)-n)]=False # ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„  ์ œ๊ฑฐ

            # ์ž์‹ ๋…ธ๋“œ๋กœ ์ด๋™
            backtracking(n+1)

            # ๋ฐฑํŠธ๋ž˜ํ‚น
            row[i]=True
            x1[i+n]=True
            x2[i+((N-1)-n)]=True
            arr[n] = 0

N = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))

row = [True]*N # ๊ฐ€๋กœ
x1 = [True]*(2*N) # ์ œ์ผ ์™ผ์ชฝ์ด ์ธ๋ฑ์Šค์ธ ์šฐ์ƒํ–ฅ ๋Œ€๊ฐ์„ 
x2 = [True]*(2*N) # ์ œ์ผ ์˜ค๋ฅธ์ชฝ์ด ์ธ๋ฑ์Šค์ธ ์šฐํ•˜ํ–ฅ ๋Œ€๊ฐ์„ 

for i in range(N):
    if arr[i] != 0:
        row[arr[i]-1] = False  # ๊ฐ€๋กœ์ค„ ์ œ๊ฑฐ
        x1[arr[i]-1 + i] = False  # ์˜ค๋ฅธ์ชฝ ์œ„ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„  ์ œ๊ฑฐ
        x2[arr[i]-1 + ((N - 1) - i)] = False  # ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„  ์ œ๊ฑฐ

backtracking(0)
print(-1)


โ—row[] : ๊ฐ€๋กœ ์ค„

row๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€๋กœ์— ๊ฒน์น˜๋Š”๊ฒŒ ์žˆ์œผ๋ฉด ์•ˆ๋˜๋ฏ€๋กœ, ํ•ด๋‹น row๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉด False๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.


โ—x2[] : ์šฐํ•˜ํ–ฅ ๋Œ€๊ฐ์„ 

x2๋Š” ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ ๊ฐ€๋Š” ๋Œ€๊ฐ์„ ์„ ๋œปํ•˜๊ณ , ์ด 2*N ๊ฐœ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ๋Œ€๊ฐ์„ ๋“ค์€ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ๊ฐ”์„๋•Œ index๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์•˜๋‹ค.

๊ทธ๋ฆผ์€ 0, 1 ๋‹จ๊ณ„๋ฅผ ๋งˆ์น˜๊ณ  2๋‹จ๊ณ„์˜ for๋ฌธ์—์„œ i=3์ผ๋•Œ ์šฐํ•˜ํ–ฅ ๋Œ€๊ฐ์„ ์ด ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

N - Queen-1

๊ทธ๋ ‡๋‹ค๋ฉด n ๋‹จ๊ณ„์˜ for๋ฌธ์˜ i๋ฒˆ์งธ row์ผ๋•Œ ์ƒ๊ธฐ๋Š” ์šฐํ•˜ํ–ฅ ๋Œ€๊ฐ์„ ์€ ๋งจ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด

i + (๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„ - ์ง€๊ธˆ ๋‹จ๊ณ„) ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋†“์•˜์„๋•Œ๋Š”

x2[i+((N-1)-n)] = False ๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด ๋Œ€๊ฐ์„ ์ด ์‚ฌ์šฉ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉด ๋œ๋‹ค.

๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌํ• ๋•Œ๋Š”

x2[i+((N-1)-n)] ๊ฐ€ True๋ฉด ๊ฒน์น˜์ง€ ์•Š๊ณ , False๋ฉด ๊ฒน์ณ์„œ ๋ถˆ๊ฐ€๋Šฅ ํ•œ๊ฒƒ์ด๋‹ค.

โ—x1[] : ์šฐ์ƒํ–ฅ ๋Œ€๊ฐ์„ 

x2๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๋ฉด x1์€ ์ž๋™์œผ๋กœ ์ดํ•ด๋œ๋‹ค.

์ฐจ์ด์ ์€ x2๋Š” ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์ด ๊ธฐ์ค€์ด์—ˆ๋‹ค๋ฉด, x1์€ ๊ฐ€์žฅ ์™ผ์ชฝ์ด ๊ธฐ์ค€์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด n ๋‹จ๊ณ„์˜ for๋ฌธ์˜ i๋ฒˆ์งธ row์ผ๋•Œ ์ƒ๊ธฐ๋Š” ์šฐ์ƒํ–ฅ ๋Œ€๊ฐ์„ ์€ ๋งจ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด

i + (์ง€๊ธˆ ๋‹จ๊ณ„) ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋†“์•˜์„๋•Œ๋Š”

x1[i+n] = False ๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด ๋Œ€๊ฐ์„ ์ด ์‚ฌ์šฉ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉด ๋œ๋‹ค.

๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฒดํฌํ• ๋•Œ๋Š”

x1[i+n] ๊ฐ€ True๋ฉด ๊ฒน์น˜์ง€ ์•Š๊ณ , False๋ฉด ๊ฒน์ณ์„œ ๋ถˆ๊ฐ€๋Šฅ ํ•œ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก ์ œ์ถœ ๊ฒฐ๊ณผ

์•„๋ž˜์˜ ํ’€์ด๊ฐ€ ๋А๋ ธ๋˜ ์ฒซ๋ฒˆ์งธ ๋ฐฉ์‹์ด๊ณ , ์œ„์˜ ํ’€์ด๊ฐ€ ๋” ๋น ๋ฅธ ํ’€์ด์ด๋‹ค.


๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌ

์ง€๋‚œ๋ฒˆ์˜ N-Queen ๋ฌธ์ œ๋ณด๋‹ค ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. ๋ฏธ๋ฆฌ ๋†“์€ Queen์˜ ๊ฐ’์„ ๋ฐ›๋Š” ์ ์ด ํฅ๋ฏธ๋กœ์› ๊ณ ,

ํ•˜๋‚˜์˜ ๋‹ต๋งŒ ๋‚˜์˜ค๋ฉด ์ถœ๋ ฅํ•ด์ฃผ์–ด์„œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ ์–ด๋””์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋ณด๊ธฐ ํŽธํ–ˆ๋‹ค.

๋‚˜์ค‘์— ๐Ÿงฉ N-Queen (Hard) ๋ฅผ ํ’€์–ด๋ณด๊ฒ ๋‹ค. (์ฐธ๊ณ ๋กœ C++๋กœ ํ’€์—ˆ๋‹ค.)

๐Ÿงฉ N-Queen (Easy) ํ’€์ด