[python] ๋ฐฑ์ค€ 9663 :: N-Queen ๐Ÿ‘‘

์ด์ฃผํฌยท2023๋…„ 3์›” 7์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
39/79
post-thumbnail

[N-Queen]

# ๋ฌธ์ œ
N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N ร— N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.

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

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

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

ํ’€์ด

์ „์ฒด ์ฝ”๋“œ

N = int(input())
# row[ํ–‰_idx] == True๋ฉด ํ€ธ์ด ์žˆ๋Š” ํ–‰
row = [False] * N
# ์—ด_idx + ํ–‰_idx  == True๋ฉด ํ€ธ์ด ์žˆ์Œ
right_cross = [False] * (2 * N - 1)
# ์—ด_idx - ํ–‰_idx + N-1 == True๋ฉด ํ€ธ์ด ์žˆ์Œ
left_cross = [False] * (2 * N - 1)

# ํ€ธ์˜ ์กฐํ•ฉ ๊ฐœ์ˆ˜
count = 0


def recursive(col_idx):
    global count
    # ์—ด ์ธ๋ฑ์Šค๊ฐ€ N์ด๋ฉด ํ€ธ์„ ๋ชจ๋‘ ๋†“์€ ๊ฑฐ๋‹ˆ๊นŒ count++ ํ•ด์ฃผ๊ณ  ๋ฆฌํ„ด
    if col_idx == N:
        count += 1
        return

    for row_idx in range(N):
        # row_idx ํ–‰์— ํ€ธ์ด ์—†๊ณ 
        if (not row[row_idx]
            # ์™ผ์ชฝ ๋Œ€๊ฐ์„ ์—๋„ ํ€ธ์ด ์—†๊ณ 
            and not left_cross[N-1 + col_idx - row_idx]
                # ์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ ์—๋„ ํ€ธ์ด ์—†์œผ๋ฉด
                and not right_cross[col_idx + row_idx]):

            # row_idx ํ–‰์— ํ€ธ์„ ๋†“๋Š”๋‹ค.
            row[row_idx] = True
            left_cross[N-1 + col_idx - row_idx] = True
            right_cross[col_idx + row_idx] = True

            # ๋‹ค์Œ ์—ด์— ๋†“์„ ํ€ธ ์ฐพ์œผ๋Ÿฌ ใ„ฑใ„ฑ
            recursive(col_idx + 1)

            # ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ๋Š” ์ด ํ–‰์— ๋†“๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋‹ˆ๊นŒ False๋กœ ๋ฐ”๊ฟ”๋‘”๋‹ค.
            row[row_idx] = False
            left_cross[N-1 + col_idx - row_idx] = False
            right_cross[col_idx + row_idx] = False


recursive(0)
print(count)

0. ํ’€์ด ๋ฐฉ๋ฒ•

  • ํ€ธ์€ ๋ชจ๋“  ํ–‰, ์—ด, ์–‘์ชฝ ๋Œ€๊ฐ์„ ์—์„œ ํ™€๋กœ ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค.
    (์Šค๋„์ฟ ๋ž‘ ๋น„์Šท?!๐Ÿ™‚)

  • ์ธ์ž๋กœ ์—ด์˜ index๋ฅผ 0๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐ›๊ณ , ๋ช‡๋ฒˆ์งธ ํ–‰ index์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฐพ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

  • ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด 0๋ถ€ํ„ฐ N-1๊นŒ์ง€ ํ–‰ ์ค‘์—์„œ
    1) ํ€ธ์ด ๋†“์ด์ง€ ์•Š์€ ํ–‰์ธ์ง€
    2) ์˜ค๋ฅธ์ชฝ ์œ„ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ํ€ธ์ด ๋†“์ด์ง€ ์•Š์•˜๋Š”์ง€
    3) ์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ํ€ธ์ด ๋†“์ด์ง€ ์•Š์•˜๋Š”์ง€
    ์œ„ ์„ธ๊ฐ€์ง€๋ฅผ ํ™•์ธํ•ด์„œ ํ€ธ์ด ๋†“์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ํ€ธ์„ ๋ฐฐ์น˜ํ•œ๋‹ค.


1. ์ค‘๋ณต์„ ์ฒดํฌํ•  ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

๊ฐ ๋ฐฐ์—ด์—์„œ
๊ฐ’์ด True์ด๋ฉด ํ€ธ์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ์ด๊ณ ,
False์ธ ๊ฒฝ์šฐ์—๋Š” ํ€ธ์ด ์—†์–ด์„œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

1) ํ–‰ ์ค‘๋ณต ์ฒดํฌ ๋ฐฐ์—ด

row = [False] * N
  • row[ํ–‰_idx] == True๋ฉด ํ€ธ์ด ์žˆ์Œ

  • ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” N

2) ์˜ค๋ฅธ์ชฝ ์œ„ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„  ์ค‘๋ณต ์ฒดํฌ ๋ฐฐ์—ด

right_cross = [False] * (2 * N - 1)
  • right_cross[์—ด_idx + ํ–‰_idx] == True๋ฉด ํ€ธ์ด ์žˆ์Œ

  • ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 2N - 1

  • ์˜ค๋ฅธ์ชฝ ์œ„๋ฅผ ํ–ฅํ•˜๋Š” ๋Œ€๊ฐ์„  ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์ •ํ•˜๊ธฐ
    ๐Ÿ‘‰๐Ÿป ์—ด index์™€ ํ–‰ index๋ฅผ ๋”ํ•œ ๊ฐ’์œผ๋กœ ์ •ํ•œ๋‹ค.

3) ์™ผ์ชฝ ์œ„ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„  ์ค‘๋ณต ์ฒดํฌ ๋ฐฐ์—ด

left_cross = [False] * (2 * N - 1)
  • left_cross[์—ด_idx - ํ–‰_idx + N-1] == True๋ฉด ํ€ธ์ด ์žˆ์Œ

  • ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 2N - 1

  • ์™ผ์ชฝ ์œ„๋ฅผ ํ–ฅํ•˜๋Š” ๋Œ€๊ฐ์„  ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์ •ํ•˜๊ธฐ
    ๐Ÿ‘‰๐Ÿป ์—ด Index์—์„œ ํ–‰ index๋ฅผ ๋นผ๊ณ , N-1์„ ๋”ํ•œ ๊ฐ’์œผ๋กœ ์ •ํ•œ๋‹ค.

2. ํ€ธ์„ ๋ชจ๋‘ ๋ฐฐ์น˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋จผ์ € ๋ถ„๊ธฐํ•œ๋‹ค.

def recursive(col_idx):
    global count
    # ์—ด ์ธ๋ฑ์Šค๊ฐ€ N์ด๋ฉด ํ€ธ์„ ๋ชจ๋‘ ๋†“์€ ๊ฑฐ๋‹ˆ๊นŒ count++ ํ•ด์ฃผ๊ณ  ๋ฆฌํ„ด
    if col_idx == N:
        count += 1
        return
  • ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์—ด index๋ฅผ ๋ณด๋‚ด์ค„ ๊ฑฐ๋‹ˆ๊นŒ,
    ๋ฐ›์€ ์ธ์ž์˜ ๊ฐ’์ด N๊ณผ ๊ฐ™์œผ๋ฉด ๋ชจ๋‘ ๊ณ ๋ฅธ ๊ฒƒ์ด๋‹ค.

  • ๋ชจ๋‘ ๊ณจ๋ž์œผ๋ฉด, ๋ฌธ์ œ์—์„œ ์‹œํ‚ค๋Š” ๋Œ€๋กœ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅํ•  ๊ฐœ์ˆ˜ count์— +1์„ ํ•ด์ฃผ๊ณ , ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.


3. ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ์ฐพ๋Š”๋‹ค.

    for row_idx in range(N):
        # row_idx ํ–‰์— ํ€ธ์ด ์—†๊ณ 
        if (not row[row_idx]
            # ์™ผ์ชฝ ๋Œ€๊ฐ์„ ์—๋„ ํ€ธ์ด ์—†๊ณ 
            and not left_cross[N-1 + col_idx - row_idx]
                # ์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ ์—๋„ ํ€ธ์ด ์—†์œผ๋ฉด
                and not right_cross[col_idx + row_idx]):
  • ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋‚˜์˜ค๋Š” 0๋ถ€ํ„ฐ N-1๊นŒ์ง€์˜ ๊ฐ’์ด ํ–‰ (row_idx)์ด ๋œ๋‹ค.

  • ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฐ’(col_idx)๊ฐ€ ์—ด์ด๋‹ค.
    ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ..๐Ÿ˜…

  • ์—ด์€ ์ค‘๋ณต์„ ์ฒดํฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค! ์ด ์—ด์—๋Š” ์ง€๊ธˆ ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋Š” ์ˆœ๊ฐ„์ด ์ฒ˜์Œ ๋†“์•„์ง€๋Š” ๊ฒƒ์ด๋‹ค.

  • ํ•ด๋‹น row_idx ํ–‰์— ํ€ธ์ด ๋ฐฐ์น˜๋˜์–ด์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•œ๋‹ค.

  • ์™ผ์ชฝ ๋Œ€๊ฐ์„ ๊ณผ ์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
    ํ€ธ์ด ๋ฐฐ์น˜๋˜์–ด์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•œ๋‹ค.

  • ์„ธ ๋ฐฐ์—ด์—์„œ ์ฐพ์€ ๊ฐ’์ด ๋ชจ๋‘ False๋ผ๋ฉด, ํ€ธ์„ ๋†“์„ ์ž๋ฆฌ๋ฅผ ์ฐพ์€ ๊ฒƒ์ด๋‹ค!! ๐Ÿ”ฅ


4. ์ฐพ์€ ์ž๋ฆฌ์— ํ€ธ์„ ๋†“์•˜๋‹ค๋Š” ๊ฒƒ์„ ํ‘œ์‹œํ•ด๋‘”๋‹ค.

            # col_idx ์—ด & row_idx ํ–‰์— ํ€ธ์„ ๋†“๋Š”๋‹ค.
            row[row_idx] = True
            left_cross[N-1 + col_idx - row_idx] = True
            right_cross[col_idx + row_idx] = True
  • ๋‹ค์Œ ์—ด์—๋Š” ์ด ์œ„์น˜์— ํ€ธ์„ ๋†“์œผ๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ True๋กœ ํ‘œ์‹œ๋ฅผ ํ•ด๋‘”๋‹ค.

  • ์ด๋Ÿฌ๋ฉด ๋‹ค์Œ ์—ด์—์„œ ํ€ธ ์œ„์น˜๋ฅผ ์ฐพ์„ ๋•Œ๋Š” 3๋‹จ๊ณ„์˜ ์กฐ๊ฑด๋ฌธ์— ์˜ํ•ด ์ด ์œ„์น˜์— ํ€ธ์„ ๋†“์ง€ ์•Š๊ฒ ์ง€!!

5. ๋‹ค์Œ ์—ด์—์„œ๋„ ํ€ธ์„ ๋†“์„ ์ž๋ฆฌ๋ฅผ ์ฐพ์œผ๋Ÿฌ ใ„ฑใ„ฑ

            # ๋‹ค์Œ ์—ด์— ๋†“์„ ํ€ธ ์ฐพ์œผ๋Ÿฌ ใ„ฑใ„ฑ
            recursive(col_idx + 1)
  • col_idx๊ฐ€ N๊ณผ ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ 3~5๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.

  • col_idx๊ฐ€ N๊ณผ ๊ฐ™์•„์ง€๋ฉด, 2๋‹จ๊ณ„์˜ if๋ฌธ์œผ๋กœ ๋น ์ง€๊ณ  ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.


6. ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์œ„ํ•ด ์ค‘๋ณต ์ฒดํฌ ๋ฐฐ์—ด์„ ๋˜๋Œ๋ฆฐ๋‹ค.

            # ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ๋Š” ์ด ํ–‰์— ๋†“๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋‹ˆ๊นŒ False๋กœ ๋ฐ”๊ฟ”๋‘”๋‹ค.
            row[row_idx] = False
            left_cross[N-1 + col_idx - row_idx] = False
            right_cross[col_idx + row_idx] = False
  • ์—ฌ๊ธฐ์„œ ์˜๋ฏธํ•˜๋Š” ๋‹ค์Œ ๋ฐ˜๋ณต์€ recursive ํ•จ์ˆ˜์˜ ๋ฐ˜๋ณต์ด ์•„๋‹Œ,
    for๋ฌธ์˜ ๋ฐ˜๋ณต์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ฆ‰, ์ง€๊ธˆ col_idx์˜ ๋‹ค๋ฅธ ํ–‰์— ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด for๋ฌธ์ด ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ๋‹ˆ๊นŒ
    ์ง€๊ธˆ ๋†“์€ ํ–‰์˜ ์œ„์น˜๋Š” ์—†์• ์ค˜์•ผ ํ•œ๋‹ค.

  • ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์›์ƒ๋ณต๊ท€ ใ„ฑใ„ฑ ๐Ÿ‘‰๐Ÿป True๋กœ ๋ฐ”๊พผ ๊ฐ’์„ ๋‹ค์‹œ False ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

profile
๐Ÿ“e-juhee.tistory.com ๐Ÿ‘ˆ๐Ÿป ์ด์‚ฌ์ค‘

0๊ฐœ์˜ ๋Œ“๊ธ€