BOJ/๐Ÿฅ‡

โ˜…Backtracking Upper-Advanced I - 1 Solvedโ˜…

metamong 2024. 1. 24.

โ˜… 9663 N-Queen โ˜…

 

#n-queens
#place n queens (not placed in the same row / col / diagonal dir)
def track(x):
    global ans
    if x == N: #finished
        ans+=1
        return
    else:
        for ny in range(N):
            if v1[ny] == v2[x+ny] == v3[x-ny] == False:
                v1[ny] = v2[x+ny] = v3[x-ny] = True
                track(x+1)
                v1[ny] = v2[x+ny] = v3[x-ny] = False         
N=int(input())
ans=0
v1=[False]*(N) #horizontal 0~(N-1)
v2=[False]*(2*N-1) #diagonal (right->left) 0 ~ 2*N-2
v3=[False]*(2*N-1) #diagonal(left->right) -(N-1) ~ (N-1)
track(0)
print(ans)

 

๐Ÿ™€ NxN ์ฒด์ŠคํŒ์—์„œ ์œ„/์•„๋ž˜/๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ™์€ queen์ด ๋†“์ด์ง€ ์•Š๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š” well-known ๋ฌธ์ œ. ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ backtracking ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰. ์ด 3๊ฐœ์˜ visited๋ฅผ ๋งŒ๋“ค์–ด tracking ํ•œ๋‹ค๋Š” ํŠน์ • idea๊ฐ€ ํ•„์š”. DFS๋กœ depth๋งˆ๋‹ค ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ๊ฐ™์€ ํ–‰์€ ๊ณ ๋ คํ•  ํ•„์š” ์—†์Œ. ๊ฐ™์€ ์—ด์— ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด y index๋กœ ๊ตฌ์„ฑ๋œ v1 list (0~N-1) / ์™ผ์ชฝ ์•„๋ž˜๋กœ ํ–ฅํ•˜๋Š” ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ๊ฐ™์ด ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด v2 list(0~2*N-2): x index์™€ y index์˜ ํ•ฉ / ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ ํ–ฅํ•˜๋Š” ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ๊ฐ™์ด ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด v3 list(-(N-1)~(N-1)): x index - y index / ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ž€์ƒ‰ ํ™”์‚ดํ‘œ v2 list๋กœ x์™€ y ์ขŒํ‘œ์˜ ํ•ฉ์ด ๋™์ผํ•œ ๊ทœ์น™. ๋นจ๊ฐ„์ƒ‰ ํ™”์‚ดํ‘œ v3 list๋กœ x - y๊ฐ€ ๋™์ผํ•œ ๊ทœ์น™

→ ํ˜„์žฌ x ์—์„œ ny๋งŒ 0~N-1๊นŒ์ง€ ์ด๋™ํ•˜๋ฉฐ v1[ny]์™€ v2[x+ny]์™€ v3[x-ny]๊ฐ€ ๋ชจ๋‘ False์ผ ๊ฒฝ์šฐ๋งŒ track() ์ง„ํ–‰(์žฌ๊ท€ ๊ตฌํ˜„). ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด backtracking. track() ์ดํ›„ ๋น ์ ธ๋‚˜์˜ฌ ๋•Œ ๋ชจ๋‘ True ํ›„์ฒ˜๋ฆฌ ํ•„์š”.

trackingํ•  ๋•Œ ํ•„์š”ํ•œ ํ•ต์‹ฌ์ธ์ž๋งŒ ์ตœ๋Œ€ํ•œ ๋Œ๋ ค ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ / ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐฉ์ง€ 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€