[Python - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Level3] N-Queen

2021. 1. 23. 18:23ใ†๐Ÿ“š Algorithm/๐Ÿ’ช๐Ÿป Python ๋ฌธ์ œ ํ’€์ด

๋ฐ˜์‘ํ˜•
 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - N-Queen

๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ n์ธ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ๋œ ์ฒด์ŠคํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒด์ŠคํŒ ์œ„์˜ n๊ฐœ์˜ ํ€ธ์ด ์„œ๋กœ๋ฅผ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๋„๋ก ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ n์ด 4์ธ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋ฉด n๊ฐœ์˜ ํ€ธ์€

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ n์ธ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ๋œ ์ฒด์ŠคํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒด์ŠคํŒ ์œ„์˜ n๊ฐœ์˜ ํ€ธ์ด ์„œ๋กœ๋ฅผ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๋„๋ก ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ n์ด 4์ธ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋ฉด n๊ฐœ์˜ ํ€ธ์€ ์„œ๋กœ๋ฅผ ํ•œ๋ฒˆ์— ๊ณต๊ฒฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์ฒด์ŠคํŒ์˜ ๊ฐ€๋กœ ์„ธ๋กœ์˜ ์„ธ๋กœ์˜ ๊ธธ์ด n์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, n๊ฐœ์˜ ํ€ธ์ด ์กฐ๊ฑด์— ๋งŒ์กฑ ํ•˜๋„๋ก ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ returnํ•˜๋Š” solutionํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • ํ€ธ(Queen)์€ ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • n์€ 12์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

ํ’€์ด ๊ณผ์ •

๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋ฏ€๋กœ DFS ๋ฌธ์ œ๋ผ๊ณ  ์ง๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ƒ๊ฐํ•ด๋‚ด๋Š”๊ฒŒ ์–ด๋ ค์› ๋‹ค. ํ˜ผ์ž ๊ณ ๋ฏผํ•ด๋ณด๋‹ค๊ฐ€ ๋„์ €ํžˆ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ• ๊ฑฐ ๊ฐ™์•„ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด์•˜๋‹ค.

 

๊ณ ๋ฏผํ•ด์•ผ ๋  ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜?!

ํ€ธ์„ ์–ด๋””์— ๋†“์„ ์ˆ˜ ์žˆ์„์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€์žˆ๋‹ค.

1. Row๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋Š” ๊ณณ

2. Column์ด ๊ฒน์น˜์ง€ ์•Š๋Š” ๊ณณ

3. ๋Œ€๊ฐ์„ ์ด ๊ฒน์น˜์ง€ ์•Š๋Š” ๊ณณ (โ†—๏ธŽ,โ†˜๏ธŽ)๋ฐฉํ–ฅ

์ด๊ฒƒ์œผ๋กœ queen์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉด๋œ๋‹ค.

๋‚˜๋Š” ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด row๊ธฐ์ค€์œผ๋กœ dfs๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ column์ด ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€, ๋Œ€๊ฐ์„  (โ†—๏ธŽ,โ†˜๏ธŽ)๋ฐฉํ–ฅ์ด ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€๋งŒ ๊ฒ€์‚ฌํ•ด์ฃผ๋ฉด ๋˜์—ˆ๋‹ค. column ๊ฒ€์‚ฌ๋Š” n ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋˜์ง€๋งŒ ๋Œ€๊ฐ์„  ๊ฒ€์‚ฌ๋Š” ๊ทœ์น™์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์€ DFS๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์–ด๋–ค ์‹์œผ๋กœ DFS๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋  ์ง€ ๊ณ ๋ฏผํ•˜๋ฉฐ DFSํ•จ์ˆ˜๋ฅผ ์งœ์•ผํ•œ๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ณผ์ •

  1. 0๋ฒˆ ์งธ ์ค„์— ๋ง์„ ๋†“๋Š”๋‹ค.
    1. (0,0)์— ๋ง์„ ๋†“๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
      1. 1๋ฒˆ์งธ ์ค„์— ๋ง์„ ๋†“๋Š”๋‹ค.
        1. (1,0) (1,1),(1,2)(1,3)๋ฅผ ์ฐจ๋ก€๋กœ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๋ง์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
      2. 2๋ฒˆ์งธ ์ค„์— ๋ง์„ ๋†“๋Š”๋‹ค.
        1. (2,0),(2,1) (2,2) (2,3)์„ ์ฐจ๋ก€๋กœ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๋ง์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
      3. 3๋ฒˆ์งธ ์ค„์— ๋ง์„ ๋†“๋Š”๋‹ค.
        1. (3,0) (3,1) (3,2) (3,3)์„ ์ฐจ๋ก€๋กœ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๋ง์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
    2. (1,0)์— ๋ง์„ ๋†“๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    3. ...(3,0) ๊นŒ์ง€ ๋ฐ˜๋ณต
def solution(n):
    global answer
    answer = 0
    col = [True] * n
    diagonal1 = [True] * (2 * n - 1)
    diagonal2 = [True] * (2 * n - 1)

    def check_queen(x, y):
        return col[y] and diagonal1[x + y] and diagonal2[x - y + n - 1]

    def dfs(x):
        global answer
        if x == n:
            answer += 1
        else:
            for idx in range(n):
                if check_queen(x, idx):
                    col[idx] = False
                    diagonal1[x + idx] = False
                    diagonal2[x - idx + n - 1] = False
                    dfs(x + 1)
                    col[idx] = True
                    diagonal1[x + idx] = True
                    diagonal2[x - idx + n - 1] = True

    dfs(0)
    return answer

 

 

 

๋ฐ˜์‘ํ˜•