๋ฐฑํŠธ๋ž˜ํ‚น

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๋‹ต์ด๋  ์ˆ˜ ์—†๋Š” ํ›„๋ณด๋Š” ๋”์ด์ƒ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๋ฐฑํŠธ๋ž˜ํ‚น ์ ˆ์ฐจ

DFS - ์œ ๋งํ•œ ๋…ธ๋“œ ๊ฒ€ํ†  - ์„œ๋ธŒํŠธ๋ฆฌ ์ด๋™ - ๋ฐฑํŠธ๋ž˜ํ‚น ์ˆ˜ํ–‰
  1. DFS ์ˆ˜ํ–‰ : ์žฌ๊ท€๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ DFS๋ฅผ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰
  2. ์œ ๋งํ•œ ๋…ธ๋“œ ๊ฒ€ํ†  : ์œ ๋งํ•œ ๋…ธ๋“œ๋ฉด ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•จ
  3. ์„œ๋ธŒํŠธ๋ฆฌ ์ด๋™ : ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์‹œ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด DFS ์ˆ˜ํ–‰
  4. ๋ฐฑํŠธ๋ž˜ํ‚น ์ˆ˜ํ–‰ : ๋”์ด์ƒ ์œ ํšจํ•œ ๋…ธ๋“œ๋ผ๊ณ  ์ƒ๊ฐ๋˜์ง€ ์•Š์œผ๋ฉด ์ƒ์œ„ ๋…ธ๋“œ๋กœ ๋ฐฑํ•˜์—ฌ ๋ฐฑํŠธ๋ž˜ํ‚น ์ˆ˜ํ–‰

 

๋ฐฑํŠธ๋ž˜ํ‚น ๋Œ€ํ‘œ ์˜ˆ์ œ

https://www.acmicpc.net/problem/15649

 

15649๋ฒˆ: N๊ณผ M (1)

ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ˆ˜์—ด์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅํ•˜๋ฉด ์•ˆ๋˜๋ฉฐ, ๊ฐ ์ˆ˜์—ด์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์—ด์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ด

www.acmicpc.net

var nm = readLine()!.split(separator: " ").map{ Int($0)! }
let N = nm[0]
let M = nm[1]

var stack = [Int]()

private func dfs() {
    if stack.count == M {
        print(stack.map{ String($0) }.joined(separator:" "))
        return
    }

    for i in 1...N {
        if !stack.contains(i) {
            stack.append(i)
            dfs()
            stack.removeLast()
        }

    }
}

dfs()

 

 

https://www.acmicpc.net/problem/9663

 

9663๋ฒˆ: N-Queen

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

www.acmicpc.net

 

func dfs(depth: Int, start: Int) {
    // depth ๊ฐ€ ๋ฐ˜์ด๋๋‹ค๋Š” ๋œป์€ ์ด๋ฏธ ํ•œ ํŒ€ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ ๋๋‹ค๋Š” ๋œป
    // ๊ทธ๋ž˜์„œ depth = n/2 ๊ฐ€ ๋˜๋ฉด, ํŒ€๊ตฌ์„ฑ๋ชปํ•œ์• ๋“ค์„(false) team2์— ๋„ฃ์–ด์คŒ!!
    if depth == n/2 {
        team1 = 0
        team2 = 0
        for i in 0..<n{
            for j in 0..<n{
                if !visited[i] && !visited[j]{
                    team2 += s[i][j]
                }
                if visited[i] && visited[j] {
                    team1 += s[i][j]
                }
            }
        }
        // ๊ทธ๋ฆฌ๊ณ  ํŒ€๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋œ ์• ๋“ค์˜ ์ฐจ๋ฅผ ๊ตฌํ•ด์„œ min๊ฐ’์„ ๊ณ„์† ๊ฐฑ์‹ ์‹œ์ผœ์ฃผ์ž
        minResult = min(minResult, abs(team1 - team2))
        return
    }
    for i in start..<n {
        if !visited[i] {
            visited[i] = true
            dfs(depth: depth + 1, start: i)
            visited[i] = false
        }
    }
}

 

๋ฐฑํŠธ๋ž˜ํ‚น ์ดํ•ด์— ๋„์›€์ด ๋˜๋Š” ์˜์ƒ

https://www.youtube.com/watch?v=Enz2csssTCs 


Ref

https://didu-story.tistory.com/270 

https://didu-story.tistory.com/371

https://www.youtube.com/watch?v=Enz2csssTCs

๋ฐ˜์‘ํ˜•
JerryiOS