[BOJ][๐ŸŸก4][๋ฐฑ์ค€#09663] N-Queen

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #9663


๋ฌธ์ œ

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


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N < 15)


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š”ย ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

8


์ถœ๋ ฅ

92


My Sol

def main(i):
    global N, V
    if i==N-1:
        for j in range(N):
            if j in V: continue
            if j-i in R: continue
            if j+i in L: continue
            return 1
        return 0

    cnt = 0
    for j in range(N):
        if j in V: continue
        if j-i in R: continue
        if j+i in L: continue

        V.add(j)
        R.add(j-i)
        L.add(j+i)

        cnt += main(i+1)

        V.remove(j)
        R.remove(j-i)
        L.remove(j+i)

    return cnt

N = int(input())
V, R, L = set(), set(), set()
print(main(0))

pypy๋กœ ํ’€์–ด์•ผ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ํ•ด์‹œ๋ฅผ ํ™œ์šฉํ•œ ๋ฐฑํŠธ๋ž˜ํ‚น๊ณผ ๋ธŒ๋ฃจํŠธํฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

  1. ์„ธ๋กœ์—ด, ์˜ค๋ฅธ์ชฝ ์œ„ ๋Œ€๊ฐ์„ , ์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์„ ์„ ๊ฐ๊ฐ V, R, L์˜ set์œผ๋กœ ๋‘์—ˆ๋‹ค.
  2. queen์„ ๋†“๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น j, j+i, j-i์˜ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜๋ฅผ ๋˜ ๋‘˜ ์ˆ˜ ์—†๋‹ค๋Š” ์„ฑ์งˆ์„ ํ™œ์šฉํ•ด set์— ๋„ฃ์–ด in ์—ฐ์‚ฐ์ž๋กœ ํ™•์ธํ•˜์˜€๋‹ค.
  3. dfs๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ํ–ˆ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

#9663(N-Queen)
n=int(input())
count=0
row,left,right=[0 for _ in range(n)],[0 for _ in range(2*n-1)],[0 for _ in range(2*n-1)]#์ˆ˜์ง,์™ผ์ชฝ๋Œ€๊ฐ์„ ,์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ 
#์ธ๋ฑ์Šค์˜ ํ•ฉ๊ณผ ์ฐจ๊ฐ€ ๊ฐ™์€ ๋Œ€๊ฐ์„ ์ƒ์— ์žˆ์„๋•Œ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์ด์šฉํ•จ
#ex)0,2๊ณผ 1,1๊ณผ 2,0์€ ๊ฐ™์€ ๋Œ€๊ฐ์„  ์ƒ์— ์œ„์น˜ํ•œ๋‹ค. ๊ฐํ–‰์—ด์˜ ํ•ฉ์ด ๊ฐ™์€๊ฒƒ์„ ์•Œ์ˆ˜์žˆ๋‹ค.
 
def Q(i):
    global count
    if i==n:    #๋๊นŒ์ง€ ํ€ธ์„ ๋„ฃ์œผ๋ฉด
        count+=1
        return
    for j in range(n):  #์—ด์„ ์ด๋™ํ•˜๋ฉฐ
        if row[j] + left[i+j] + right[n-1+i-j]==0: #์„ธ์กฐ๊ฑด์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋ฉด
            row[j]=left[i+j]=right[n-1+i-j]=1
            Q(i+1)
            row[j]= left[i+j]= right[n-1+i-j] = 0#์ดˆ๊ธฐํ™”
 
Q(0)
print(count)

set์ด ์•„๋‹Œ list์˜ ์ธ๋ฑ์Šค์— ๋”ฐ๋ฅธ 0/1 ์ฒดํฌ๋กœ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•œ ๋ฒˆ์— 0, 1๋กœ ์กฐ๊ฑด ์ฒดํฌ ๋ฐ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ ์™œ ์—ฐ์‚ฐ์†๋„๊ฐ€ ๋” ๋น ๋ฅธ์ง€๋Š” ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ