suvera-dev ๐Ÿฅฆ

Backtracking ๋ฐฑํŠธ๋ž˜ํ‚น ๋Œ€ํ‘œ ๋ฌธ์ œ ) NQueen - Swift๋กœ ๊ตฌํ˜„ ๋ณธ๋ฌธ

Algorithm/CodingTest- Swift

Backtracking ๋ฐฑํŠธ๋ž˜ํ‚น ๋Œ€ํ‘œ ๋ฌธ์ œ ) NQueen - Swift๋กœ ๊ตฌํ˜„

suvera 2023. 3. 30. 20:43

NQueen ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ Swift ํ’€์ด๊ฐ€ ๋งŽ์ด ์—†์–ด์„œ ์˜ฌ๋ ค๋ด…๋‹ˆ๋‹ค.

 


Backtracking ์ด๋ž€?

๐Ÿ”ฅ ํ•ด๋ฅผ ์ฐพ๋Š” ๋„์ค‘ ํ•ด๊ฐ€ ์•„๋‹ˆ์–ด์„œ ๋ง‰ํžˆ๋ฉด, ๋˜๋Œ์•„๊ฐ€์„œ ๋‹ค์‹œ ํ•ด๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
โ†’ ์ฆ‰, DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ์•ฝ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด ๊ทธ ์ฆ‰์‹œ ์ค‘๋‹จํ•˜๊ณ  ์ด์ „์œผ๋กœ ๋Œ์•„๊ฐ€ ๋‹ค์‹œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์›ํ•˜๋Š” ์กฐ๊ฑด์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค.
 
์ •๋ฆฌํ•˜์ž๋ฉด,  ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘์—์„œ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ
๐Ÿ”ฅ ์ฃผ๋กœ ๋ฌธ์ œ ํ’€์ด์—์„œ๋Š” DFS ๋“ฑ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ, ์กฐ๊ฑด๋ฌธ ๋“ฑ์„ ๊ฑธ์–ด ๋‹ต์ด ์ ˆ๋Œ€๋กœ ๋  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ์ •์˜ํ•˜๊ณ , ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์ผ ๊ฒฝ์šฐ์—๋Š” ํƒ์ƒ‰์„ ์ค‘์ง€์‹œํ‚จ ๋’ค ๊ทธ ์ด์ „์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค์‹œ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ฒŒ๋” ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 


N-Queen ๋ฌธ์ œ

NxN ํฌ๊ธฐ์˜ ์ฒด์ŠคํŒ์— N๊ฐœ์˜ ํ€ธ์„ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๋„๋ก ๋ฐฐ์น˜ํ•˜๋Š” ๋ฌธ์ œ

- N-Queen ๋ฌธ์ œ๋Š” N์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค๋ฉด DFS ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ N์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ํƒ์ƒ‰ํ•ด์•ผํ•  ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

N-Queen ๋ฌธ์ œ์˜ ํ’€์ด ์•„์ด๋””์–ด๋Š” ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ์–ด์š” ! ์™„์ „ ์„ค๋ช… ๊ตฟ. !! ์ด๊ฒƒ๋ณด๋‹ค ์ž˜ ํ•  ์ž์‹ ์ด ์—†์–ด์„œ ๋„˜๊น๋‹ˆ๋‹ค. ใ…‹ใ…‹

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking) | C์–ธ์–ด N-Queen๊ตฌํ˜„

๋ฐฑํŠธ๋ž˜ํ‚น์ด๋ž€? ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking) ์€ ํ•ด๋ฅผ ์ฐพ๋Š” ๋„์ค‘ ํ•ด๊ฐ€ ์•„๋‹ˆ์–ด์„œ ๋ง‰ํžŒ๋‹ค๋ฉด, ๋˜๋Œ์•„๊ฐ€์„œ ๋‹ค์‹œ ํ•ด๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ํ•ด๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋„์ค‘, ์ง€๊ธˆ์˜ ๊ฒฝ๋กœ๊ฐ€ ํ•ด๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ๊ฒฝ๋กœ๋ฅผ

code-lab1.tistory.com

 

์ €๋Š” ์œ„์˜ ๊ธ€๋กœ ์ด๋ก ์„ ์ดํ•ดํ•œ ๋‹ค์Œ์— ๋‹ค๋ฅธ ์–ธ์–ด ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค !

๊ฐ€์žฅ ์ดํ•ด๊ฐ€ ์ž˜๋˜๋Š” ํ’€์ด๋ฅผ ๊ณจ๋ผ์„œ Swift๋กœ ๊ตฌํ˜„ํ•ด์คฌ์Šต๋‹ˆ๋‹ค !! 

 

[๋ฐฑ์ค€ / BOJ] - 9663๋ฒˆ N-Queen C++ ํ’€์ด

๋ฐฑ์ค€ - ๋‹จ๊ณ„๋ณ„๋กœ ํ’€์–ด๋ณด๊ธฐ [9663] https://www.acmicpc.net/problem/9663 ๋ฌธ์ œ ํ’€์ด N-Queen ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์˜ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ œ๋กœ์„œ, ํ€ธ์˜ ํŠน์„ฑ์ƒ ์ฒด์ŠคํŒ ํ•œ ํ–‰๋‹น ํ•œ ๊ฐœ์˜ ํ€ธ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ „์ œ

cryptosalamander.tistory.com

 

์œ„ ๋ธ”๋กœ๊ทธ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ N-Queen ๋ฌธ์ œ๋ฅผ Swift๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹น.

func solution(_ n:Int) -> Int {
    
    var chess = Array(repeating: -1, count: n)
    var answer = 0 
    
    // ์œ ๋ง์„ฑ ๊ฒ€์‚ฌ
    func checkArrangeQueen(row: Int) -> Bool {
        for i in 0..<row {
            if chess[i] == chess[row] || abs(chess[row] - chess[i]) == abs(row - i) {
                // ๊ฐ™์€ ์—ด์ด๊ฑฐ๋‚˜ ๋Œ€๊ฐ์„ ์ผ ๊ฒฝ์šฐ  
                return false
            }
        }
        
        return true
    }
    
    // ํ–‰์„ ๊ธฐ์ค€์œผ๋กœ DFS. 1ํ–‰ -> 2ํ–‰ -> 3ํ–‰ ...
    
    func dfs(row: Int) {
        
        // ๋งŒ์•ฝ์— ๋๊นŒ์ง€ ๋‹ค ๋ฐฐ์น˜ํ–ˆ์„ ๊ฒฝ์šฐ. +1
        if row == n {
            answer += 1
            return
        }
        
        // ํ•˜๋‚˜์˜ ํ–‰์—์„œ ๋ชจ๋“  ์—ด์˜ ์œ ๋ง์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค. 
        for i in 0..<n {
            chess[row] = i // ๊ทธ ์ž๋ฆฌ์— ์ผ๋‹จ ๋ฐฐ์น˜ 
            
            if checkArrangeQueen(row: row) {
                // ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, 
                dfs(row: row + 1) // ๋‹ค์Œ ํ–‰ DFS
            }
            // ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋‹ค์Œ index๋กœ ๋„˜์–ด๊ฐ.
        }
    }
    
    dfs(row: 0)
    
    return answer
}

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12952

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

Comments