N-Queen

'''
https://programmers.co.kr/learn/courses/30/lessons/12952
N-Queen
[ํ’€์ด]
1. stack์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์›์†Œ๋ฅผ ์ง‘์–ด๋„ฃ๋Š”๋‹ค
{0} : story, ๋ช‡๋ฒˆ์งธ ๊ฐ€๋กœ์ค„์ธ์ง€.
=> ์ดˆ๊ธฐ์— ์ฒซ๋ฒˆ์งธ ๊ฐ€๋กœ์ค„๋กœ ์ดˆ๊ธฐํ™”. ์œ„์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘.
{1} : hor, ๋ช‡๋ฒˆ์งธ ์„ธ๋กœ์ค„์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š”์ง€.
=> ์ด์ „์— ๊ณ ๋ฅธ ์„ธ๋กœ์ค„์€ ๊ณ ๋ฅด์ง€ ๋ชปํ•˜๋ฏ€๋กœ ํ•˜๋‚˜์”ฉ ์—†์–ด์ง„๋‹ค.
=> ์„ ํƒํ•œ ์„ธ๋กœ์ค„์„ ์—†์• ๊ธฐ ์œ„ํ•ด set ์ž๋ฃŒํ˜• ์„ ํƒ
{2, 3} : diag1, diag2, ๋Œ€๊ฐ์„  ๊ฒ€์‚ฌ
=> ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„๋ฅผ (1, 1) ์ด๋ผ๊ณ  ํ•˜๋ฉด
=> ๊ธฐ์šธ๊ธฐ๊ฐ€ -1 ์ธ ๋Œ€๊ฐ์„ ๋“ค์˜ ๊ณตํ†ต์ ์€ ๋‘ ์ขŒํ‘œ์˜ ์ฐจ๊ฐ€ ์ผ์ •ํ•˜๋‹ค๋Š” ๊ฒƒ => diag1
=> ๊ธฐ์šธ๊ธฐ๊ฐ€ 1์ธ ๋Œ€๊ฐ์„ ๋“ค์˜ ๊ณตํ†ต์ ์€ ๋‘ ์ขŒํ‘œ์˜ ํ•ฉ์ด ์ผ์ •ํ•˜๋‹ค๋Š” ๊ฒƒ => diag2
2. dfs ๋ฐฉ์‹์œผ๋กœ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ€๋กœ ์ธต์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ํƒ์ƒ‰ํ•œ๋‹ค.
=> bfs ๋ฐฉ์‹์ด์–ด๋„ ํฐ ์ƒ๊ด€์€ ์—†์Œ
'''
def solution(n):
    answer = 0
    stack = [[1, set(range(1, n + 1)), [], []]]
    while stack:
        story, hor, diag1, diag2 = stack.pop()
        if story == n + 1:
            answer += 1
            continue
        for x in hor:
            if x - story not in diag1 and x + story not in diag2:
                stack.append([story + 1, hor - set([x]), diag1 + [x - story], diag2 + [x + story]])

    return answer
    
'''
๋ฏธ์นœ ํ’€์ด
nQueen = [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512, 95815104, 666090624, 4968057848, 39029188884, 314666222712, 2691008701644, 24233937684440, 227514171973736, 2207893435808352, 22317699616364044, 234907967154122528].__getitem__

'''

Last updated

Was this helpful?