์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๋ฐฑ์ค€ 9663) N-Queen [ Python, ๋ฐฑํŠธ๋ž˜ํ‚น ]

proggg 2025. 1. 13. 20:53
728x90

 


๋ถ„๋ฅ˜ : DFS, ๋ฐฑํŠธ๋ž˜ํ‚น

๋ฌธ์ œ๋Š” ๊ต‰์žฅํžˆ ๋‹ด๋ฐฑํ•œ๋ฐ, ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ํ’€๊ธฐ ํž˜๋“ค๋‹ค. 


keypoint : DFS, ๋ฐฑํŠธ๋ž˜ํ‚น


code

import sys
input = sys.stdin.readline
 
n = int(input())
	
visited = [-1] * n
cnt = 0
 
def check(now_row):
    for row in range(now_row):
        if visited[now_row] == visited[row] or now_row - row == abs(visited[now_row] - visited[row]):
            return False
    return True
 
def dfs(row):
    global cnt
    
    if row == n: 
        cnt += 1
 
    else:
        for col in range(n):
            visited[row] = col
            if check(row): 
                dfs(row + 1) 
                
dfs(0)
print(cnt)

์ค‘์š”ํ•œ ๋‚ด์šฉ 

์ฒด์ŠคํŒ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด ์ธ์ƒ์ ์ธ ํ’€์ด ๋ฐฉ์‹์ด์—ˆ๋‹ค.

1์ฐจ์› ๋ฐฐ์—ด์„ initialize ํ•ด๋†“๊ณ  ๋ฐฐ์—ด ๊ฐ ์š”์†Œ์˜ ๊ฐ’์ด ์—ด์ด ๋˜๊ณ  ์ธ๋ฑ์Šค๊ฐ€ ํ–‰์˜ ๊ฐ’์ด ๋˜๋Š” ํ’€์ด ๋ฐฉ์‹์œผ๋กœ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฌธ์ œ ํ’€์ด ๋ฐฉ์‹์ธ๋ฐ ์œ„ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐข์–ด์„œ ํ•ด์„ํ•ด๋ณด๊ฒ ๋‹ค.

 

 

๊ฐ™์€ ์—ด์— ํ€ธ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

def check(now_row):
    for row in range(now_row):
        if visited[now_row] == visited[row] or now_row - row == abs(visited[now_row] - visited[row]):
            return False
    return True

 

visited[now_row] == visited[row] ๋Š” 0๋ถ€ํ„ฐ now_row-1 ๊นŒ์ง€์˜ ํ–‰์„ ๊ฒ€์‚ฌํ•˜๋ฉด์„œ ๊ฐ™์€ ์—ด { ๋ฐฐ์—ด์˜ ๊ฐ’์ด '์—ด' ๊ฐ’์ด๋‹ค. }์— ํ€ธ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. 

 

now_row - row == abs(visited[now_row] - visited[row]) ๋Š” ๋Œ€๊ฐ์„ ์— ์œ„์น˜ํ•œ ํ€ธ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. 

now_row - row ๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ row ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋Œ€๊ฐ์„ ์— ์œ„์น˜ํ•œ๋‹ค๋ฉด '์—ด' ๊ณผ ๊ฐ™์€ ๊ฐ’๋งŒํผ ๋–จ์–ด์ ธ ์žˆ์„ํ…Œ๋‹ˆ now_row - ro == abs(visited[now_row] - visited[row]) ๊ฐ€  True ๋ผ๋ฉด ๋Œ€๊ฐ์„ ์— ํ€ธ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ False ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

def dfs(row):
    global cnt
    
    if row == n: 
        cnt += 1
 
    else:
        for col in range(n):
            visited[row] = col
            if check(row): 
                dfs(row + 1)

 

์ฒด์ŠคํŒ์—์„œ row ๊ฐ€ n ๊นŒ์ง€ ์ž˜ ์›€์ง์—ฌ ํ€ธ์„ ๋†“์•˜๋‹ค๋ฉด cnt๋ฅผ 1์ถ”๊ฐ€ ํ•œ๋‹ค. 

 

n ๊นŒ์ง€ ์ปค์ง€๊ธฐ ์ „, ์žฌ๊ท€์ ์œผ๋กœ ํ€ธ์„ ๋†“์•˜๋˜ ํ•˜๋‚˜์˜ ์นธ๋งˆ๋‹ค ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ฒดํฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

728x90