๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

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

by Fomagran ๐Ÿ’ป 2021. 8. 28.
728x90
๋ฐ˜์‘ํ˜•

Problem

 

 

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

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

programmers.co.kr


Solution

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น(DFS)์œผ๋กœ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

1. ๊ฐ ํ–‰๋งˆ๋‹ค ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ฒดํฌํ•œ๋‹ค.

 

๊ฐ ํ–‰๋งˆ๋‹ค ํ€ธ์€ ํ•˜๋‚˜์”ฉ๋ฐ–์— ๋ชป๋†“์œผ๋ฏ€๋กœ ํ˜„์žฌ ํ–‰์˜ ์—ด๋“ค์— ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ํ€ธ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ํ€ธ์ด ์—†๋‹ค๋ฉด ํ˜„์žฌ ์œ„์น˜๋ฅผ history(ํ€ธ์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด)์— ์ €์žฅํ•ด๋†“๊ณ  ๋‹ค์Œ ํ–‰์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€ ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ answer(๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ˆ˜)๋ฅผ +1 ์ฆ๊ฐ€์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 

func findEnableArrange(n:Int,depth:Int,history:[[Bool]],answer:inout Int) {
    //๊ฐ€์žฅ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์™”์„ ๊ฒฝ์šฐ
    if depth == n {
        //๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋ฏ€๋กœ +1 ํ•ด์คŒ
        answer += 1
        return
    }
    //ํ˜„์žฌ ํ–‰์— ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
    for x in 0..<n {
        //๊ณต๊ฒฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด
        if isUnableAttack(history: history, x: x, y:depth) {
            var newHistory = history
            newHistory[depth][x] = false
            //dfs๋กœ ์ง„ํ–‰
            findEnableArrange(n: n, depth: depth+1,history: newHistory,answer: &answer)
        }
    }
}

 

2. ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ํ€ธ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.

 

๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ํ€ธ์€ ์„ธ๋กœ๋ฐฉํ–ฅ ๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ํ€ธ์ด ์žˆ๋Š”์ง€๋งŒ ์ฒดํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์„ธ๋กœ๋ฐฉํ–ฅ์€ ํ˜„์žฌ x์˜ ๋ชจ๋“  ํ–‰์„ ๊ฒ€์‚ฌํ•˜๋ฉด ๋˜๊ณ 

 

๋Œ€๊ฐ์„ ์ผ ๊ฒฝ์šฐ์—” ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚˜๋ˆ ์„œ ํ€ธ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ (x,y)์˜ ๋ชจ๋“  ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์„ ๊ตฌํ•  ๋•Œ ๊ทœ์น™์€ ์™ผ์ชฝ ๋ฐฉํ–ฅ์ผ ๊ฒฝ์šฐ (x-abs(y-i),i)๋ฅผ ์ฒดํฌํ•˜๋ฉด ๋˜๊ณ  

 

์˜ค๋ฅธ์ชฝ์„ ๊ฒ€์‚ฌํ•  ๊ฒฝ์šฐ (x+abs(y-i),i)๋ฅผ ์ฒดํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

//๊ณต๊ฒฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€ ์ฒดํฌํ•œ๋‹ค
func isUnableAttack(history:[[Bool]],x:Int,y:Int) -> Bool {
    for i in 0..<history.count {
        //์„ธ๋กœ ํ™•์ธ
        if !history[i][x]  {
            return false
        //๋Œ€๊ฐ์„ ์œผ๋กœ ์™ผ์ชฝ ํ™•์ธ
        }else if 0..<history.count ~= x-abs(y-i) && !history[i][x-abs(y-i)] {
            return false
        //๋Œ€๊ฐ์„ ์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ™•์ธ
        }else if 0..<history.count ~= x+abs(y-i) && !history[i][x+abs(y-i)] {
            return false
        }
    }
    return true
}

 

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์œ„์น˜๊ฐ€ 2,2๋ผ๋ฉด x =2 ์ด๊ณ  y=2 ์ž…๋‹ˆ๋‹ค.

 

์™ผ์ชฝ ๋ฐฉํ–ฅ์˜ ๋Œ€๊ฐ์„ ์„ 0๋ถ€ํ„ฐ n-1๊นŒ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค๋ฉด 0๋ฒˆ์งธํ–‰์€  (2 - abs(2-0),0) = (0,0)์„ ์ฒดํฌํ•ด์ค๋‹ˆ๋‹ค.

 

 

 

 

์˜ค๋ฅธ์ชฝ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 0๋ฒˆ์งธ ํ–‰์„ ๊ฒ€์‚ฌํ•œ๋‹ค๋ฉด (2 + abs(2-0),0) = (4,0)์„ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

3. ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

return answer

Source Code

 


P.S

 

๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๋ผ๊ณ  ํ•ด์„œ ์ข€ ๊ฒ๋จน์—ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ฐฑํŠธ๋ž˜ํ‚น์ด DFS๊ตฌ๋‚˜ ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๋˜ ํ€ธ์˜ ์œ„์น˜๋ฅผ ๊ทธ๋ƒฅ ๊ฐ™์€ ํ–‰์—์„œ x๋ฒˆ์งธ๋“ค๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด ๋๋Š”๋ฐ ๋ฐ”๋ณด๊ฐ™์ด ๋ชจ๋“  ํ–‰๊ณผ ๋ชจ๋“  ์—ด์„ ๊ฒ€์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์„œ

 

์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค...


๋‹ค๋ฅธ ์‚ฌ๋žŒ ํ’€์ด ์ค‘ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ’€์ด

 

์•„๋ž˜์™€ ๊ฐ™์ด ๋Œ€๊ฐ์„ ์„ ์ฒดํฌํ•  ๋•Œ abs(x-i) - abs(y-chess[i])๋กœ ์ฒดํฌํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

func solution(_ n:Int) -> Int {
    var chess = [Int].init(repeating: -1, count: n)
    var answer = 0

    func check(_ x: Int, _ y: Int) -> Bool {
        for i in 0..<x {
            if chess[i] == y || abs(x - i) - abs(y - chess[i]) == 0 { return false }
        }

        return true
    }

    func dfs(_ cnt: Int) {
        if cnt == n {
            answer += 1
            return
        }

        for i in 0..<n {
            if check(cnt, i) {
                chess[cnt] = i
                dfs(cnt + 1)
                chess[cnt] = -1
            }
        }
    }

    dfs(0)

    return answer
}
728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€