๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ Computer Science/Algorithm

[Algorithm] ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking)์ด๋ž€? (feat. ์˜ˆ์ œํฌํ•จ)

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

 

์•ˆ๋…•ํ•˜์„ธ์š” Foma ๐Ÿ’ป ์ž…๋‹ˆ๋‹ค!

 

์˜ค๋Š˜์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค N-Queen ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”.

 

๊ทธ๋ž˜์„œ ๋ฐฑํŠธ๋ž˜ํ‚น์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ฒŒ์š”~


๋ฐฑํŠธ๋ž˜ํ‚น์ด๋ž€?

 

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ „๋ถ€ ๊ณ ๋ คํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ƒํƒœ๊ณต๊ฐ„์„ ํŠธ๋ฆฌ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์„ ๋•Œ ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด๋‹ค. ์ผ์ข…์˜ ํŠธ๋ฆฌ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ๋ด๋„ ๋œ๋‹ค. ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(Depth First Search, DFS)๊ณผ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(Breadth First Search, BFS), ์ตœ์„  ์šฐ์„  ํƒ์ƒ‰(Best First Search/HeuristicSearch)์ด ์žˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ผ๋ฉด, DFS๊ฐ€ ๋‚ซ๋‹ค. BFS๋กœ๋„ ๊ตฌํ˜„์ด ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, BFS๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ฐ„ ํ์˜ ํฌ๊ธฐ๊ฐ€ . ์‹ฌ์ง€์–ด ์†๋„๋„ ๋˜‘๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ DFS๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ ๋ฌธ์ œ๋“ค์€DFS๋ฅผ ์จ๋„ ์ผ๋‹จ ๋‹ต์€ ๋‚˜์˜จ๋‹ค. - ๋‚˜๋ฌด ์œ„ํ‚ค -

 

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

 

์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ํž˜๋“œ์‹ค๊ฑฐ์—์š”.


ํ™€์ง ๋งŒ๋“ค๊ธฐ

 

A,B,C ์„ธ ์‚ฌ๋žŒ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ค„ ์„ธ์›๋‹ˆ๋‹ค.

 

๋‹จ, ์กฐ๊ฑด์€ ์ง์ˆ˜๋‚˜ ํ™€์ˆ˜๊ฐ€ ์—ฐ์†์œผ๋กœ 2๋ฒˆ ๋‚˜์˜ค๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

 

์ด ๋•Œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜์‹œ์˜ค.

 

(์ˆœ์„œ๋Š” A-B-C ์ž…๋‹ˆ๋‹ค.)

 

 

A - 1 

B - 4

C-  7

 

ํ™€์ˆ˜๋‚˜ ์ง์ˆ˜๊ฐ€ ์—ฐ์†๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

A - 1

B - 4

C - 8

 

์ง์ˆ˜๊ฐ€ ์—ฐ์†๋˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

A - 1

B - 4

C - 9

 

ํ™€์ˆ˜๋‚˜ ์ง์ˆ˜๊ฐ€ ์—ฐ์†๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

A - 1

B - 5

 

ํ™€์ˆ˜๊ฐ€  ์—ฐ์†๋˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ณ ๋กœ B์˜ ๋‹ค์Œ ์ˆซ์ž๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ์‹์œผ๋กœ ์กฐ๊ฑด๋“ค์„ ํ•˜๋‚˜์”ฉ ๋Œ€์ž…ํ•ด๊ฐ€๋ฉด์„œ ๋งŒ์•ฝ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ ์ฆ‰์‹œ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค์Œ ์ˆซ์ž๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณค ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆซ์ž ์กฐํ•ฉ์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.


์ฝ”๋“œ ๊ตฌํ˜„

 

A,B,C์˜ ์ˆซ์ž๋“ค์„ ์ฐจ๋ก€๋กœ ๋‹ด์•„ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

[[1,2,3],[4,5,6],[7,8,9]]

 

๊ฐ€๋Šฅํ•œ ์ˆซ์ž ์กฐํ•ฉ๋“ค์„ ๋‹ด์„ answer 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

var answer:[[Int]] = []

 

 

A,B,C์˜ ์ˆซ์ž๋“ค์„ ๋‹ด๋Š” numbers,

 

ํ˜„์žฌ ๊นŠ์ด๊ฐ€ ์–ด๋Š ์ •๋„์ธ์ง€ ๋‚˜ํƒ€๋‚ผ depth,

 

๊ฐ€๋Šฅํ•œ ์ˆซ์ž ์กฐํ•ฉ์„ ๋„ฃ์„ answer,

 

ํ˜„์žฌ depth๊นŒ์ง€ ์ˆซ์ž๋“ค์„ ๊ธฐ์–ตํ•  history๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ตฌํ˜„ํ•ด์ค๋‹ˆ๋‹ค.

 

func dfs(numbers:[[Int]],depth:Int,answer:inout [[Int]],history:[Int]) {
...

 

๋งŒ์•ฝ depth๊ฐ€ numbers์˜ ๋๊นŒ์ง€ ์™”๋‹ค๋ฉด ๋ชจ๋“  ์ˆซ์ž๋“ค์ด ์กฐ๊ฑด์— ๋งž์•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ answer์— history๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

if depth == numbers.count {
        answer.append(history)
        return
    }

 

๋งŒ์•ฝ history๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ(A)์ด๋ฏ€๋กœ history์— ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  depth๋ฅผ +1 ํ•ด์ค€ ๋’ค ์žฌ๊ท€ํ•ด์ค๋‹ˆ๋‹ค.

 

if history.isEmpty {
        for n in numbers[depth] {
            var newHistory = history
            newHistory.append(n)
            dfs(numbers: numbers, depth: depth+1, answer: &answer, history: newHistory)
        }

 

๋งŒ์•ฝ history๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ˜„์žฌ depth์˜ ์ˆซ์ž๋“ค์„๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ history์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์ˆซ์ž์™€ ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ํ™€์ˆ˜๋‚˜ ์ง์ˆ˜๊ฐ€

 

์—ฐ์†๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด history์— ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  depth๋ฅผ +1 ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 

else {
        for n in numbers[depth] {
            //๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ ์ง์ˆ˜๊ณ  n์ด ํ™€์ˆ˜๋ผ๋ฉด
            if history.last!%2 == 0 && n%2 != 0 {
                var newHistory = history
                newHistory.append(n)
                dfs(numbers: numbers, depth: depth+1, answer: &answer, history: newHistory)
            }
            //๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ ํ™€์ˆ˜๊ณ  n์ด ์ง์ˆ˜๋ผ๋ฉด
            if history.last!%2 != 0 && n%2 == 0 {
                var newHistory = history
                newHistory.append(n)
                dfs(numbers: numbers, depth: depth+1, answer: &answer, history: newHistory)
            }
        }
    }

 

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ชจ๋“  ํƒ์ƒ‰์ด ๋๋‚ฌ์„ ๋•Œ answer๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ํ™€์ˆ˜์™€ ์ง์ˆ˜๊ฐ€ ์—ฐ์†๋˜์ง€ ์•Š๋Š” ์ˆซ์ž๋“ค์˜ ์กฐํ•ฉ์ด ๋‹ด๊ฒจ์žˆ๋Š”

 

๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

func solution(_ numbers:[[Int]]) {
    var answer:[[Int]] = []
    dfs(numbers: numbers, depth: 0, answer: &answer, history: [])
    print(answer)
}

//[[1, 4, 7], [1, 4, 9], [1, 6, 7], [1, 6, 9], [2, 5, 8], [3, 4, 7], [3, 4, 9], [3, 6, 7], [3, 6, 9]]

Source Code

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€