๐Ÿ“ Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] 03. ์ˆœ์—ด๊ณผ ์กฐํ•ฉ, ๊ทธ๋ฆฌ๊ณ  ์žฌ๊ท€ with Swift

JINiOS 2024. 2. 6. 20:25
728x90

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””ํ•˜๋ฉด์„œ ์žฌ๊ท€์— ๋Œ€ํ•ด ์ž˜ ์ดํ•ดํ•˜๊ณ  ์“ฐ์ง€ ๋ชปํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. 

ํ”ผ๋ณด๋‚˜์น˜๋‚˜ ํŒฉํ† ๋ฆฌ์–ผ ๋ฌธ์ œ ์ •๋„๋Š” ๊ดœ์ฐฎ์€๋ฐ, ์ดํ•ด๋„๊ฐ€ ์กฐ๊ธˆ ๋ถ€์กฑํ–ˆ์–ด์„œ ๊ทธ ์ด์ƒ์€ ์ฒดํ™”๋˜์ง€ ์•Š์•„, ์‰ฝ๊ฒŒ ์žฌ๊ท€๋ฅผ ๋– ์˜ฌ๋ ค ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค.

 

์ด๋ฒˆ์— ์ฝ”ํ…Œ๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ, ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ๋ณด๋‹จ ๋ถ€์กฑํ–ˆ๋˜ ๊ธฐ๋ณธ ๊ฐœ๋…์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž!๋ผ๋Š” ๋งˆ์Œ์œผ๋กœ ์ˆœ์—ด๊ณผ ์กฐํ•ฉ์„ ๋“ค์—ฌ๋‹ค๋ณด์•˜๊ณ , ์ˆœ์—ด๊ณผ ์กฐํ•ฉ์„ ์•Œ์•„๊ฐ€๋ฉด์„œ ์žฌ๊ท€์— ๋Œ€ํ•ด์„œ๋„ ์ž์—ฐ์Šค๋ ˆ ์ฒดํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค-!!!

 


์ˆœ์—ด (permutation)

์ˆœ์—ด์ด๋ž€ ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์˜ ์›์†Œ์—์„œ r๊ฐœ๋ฅผ ์ค‘๋ณต ์—†์ด ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.(๋‹จ, 0<r≤n์ผ ๋•Œ)

 

๊ณ ๋“ฑํ•™๊ต ์ˆ˜ํ•™์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ ์ˆœ์—ด์€ ์ˆ˜ํ•™์ ์œผ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(์—ฌ๊ธฐ์„œ n!์€ n์˜ ๊ณ„์Šน(factorial)์„ ์˜๋ฏธํ•˜๋ฉฐ, 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ž์—ฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ณฑํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.)

  • nPr : ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์˜ ์›์†Œ์—์„œ r๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ์ˆœ์—ด์˜ ์ˆ˜
  • nPr = n! / (n-r)!

์˜ˆ๋ฅผ ๋“ค์–ด, 5๊ฐœ์˜ ์ˆซ์ž 1, 2, 3, 4, 5์—์„œ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 5P3 = 5! / (5-3)! = 120์ž…๋‹ˆ๋‹ค.

 

 

์กฐํ•ฉ (combination)

์กฐํ•ฉ์ด๋ž€ ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์˜ ์›์†Œ์—์„œ r๊ฐœ๋ฅผ ์„ ํƒํ•  ๋•Œ, ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.(๋‹จ, 0<r≤n์ผ ๋•Œ)
  • nCr : ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์˜ ์›์†Œ์—์„œ r๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ์กฐํ•ฉ์˜ ์ˆ˜
  • nCr = n! / (r! * (n-r)!)

์˜ˆ๋ฅผ ๋“ค์–ด 5๊ฐœ์˜ ์ˆซ์ž 1, 2, 3, 4, 5์—์„œ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 5C3 = 5! / (3! * 2!) = 10์ž…๋‹ˆ๋‹ค.

 

 

์ˆœ์—ด๊ณผ ์กฐํ•ฉ์˜ ์ฐจ์ด

๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ์ˆœ์„œ๋ผ๊ณ  ๊ธฐ์–ตํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ’จ

 


์ˆœ์—ด์˜ ๋ผˆ๋Œ€

์ž์—ฐ์ˆ˜ N๊ณผ M์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ ์ค‘๋ณต ์—†์ด M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด  > ์ˆœ์—ด - ๋ฐฑ์ค€ N๊ณผ M(1)

func ์ˆœ์—ด(_ depth: Int) {
    if ๋Ž์Šค๊ฐ€ ์›ํ•˜๋Š” ๊ธธ์ด์ธ M๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด
        ์ถœ๋ ฅ
    else { ์•„์ง ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
        for ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ N-1๊นŒ์ง€ ๋ˆ๋‹ค {
       	    if ๋งŒ์•ฝ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด {
                ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
                ํ˜„์žฌ์ˆœ์—ด[๋Ž์Šค] = ํ˜„์žฌ ์ธ๋ฑ์Šค + 1 
                ์ˆœ์—ด(๋Ž์Šค + 1)
                ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ•ด์ œ
            }
        }
    }
}

 

Swift๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

var res = Array(repeating: 0, count: M)

func solution(_ lev: Int) {
    if lev == M {
        print(res.map {String($0)}.joined(separator: " "))
    } else {
        for i in 0..<N {
            if visited[i] == false {
                visited[i] = true
                res[lev] = i+1
                solution(lev + 1)
                visited[i] = false
            }
        }
    }
}

solution(0)

 

 

์กฐํ•ฉ์˜ ๋ผˆ๋Œ€

  • ์ž์—ฐ์ˆ˜ N๊ณผ M์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ ์ค‘๋ณต ์—†์ด M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด - ๋ฐฑ์ค€ N๊ณผ M(2)
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค > ์•ž์—์„œ ๋ฝ‘์€ ์ˆ˜๋Š” ๋’ค์—์„œ ๋ฝ‘์ง€ ์•Š๋Š”๋‹ค > ์กฐํ•ฉ
func ์กฐํ•ฉ(_ depth: Int, _ start: Int) {
    if ๋Ž์Šค๊ฐ€ M๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด {
        ๊ฒฐ๊ณผ๋ฐฐ์—ด ์ถœ๋ ฅ
    } else {
        ์ธ๋ฑ์Šค๋ฅผ start ๋ถ€ํ„ฐ N-1๊นŒ์ง€ ๋ฐ˜๋ณต {
            ๊ฒฐ๊ณผ ๋ฐฐ์—ด[๋Ž์Šค] = ์ธ๋ฑ์Šค + 1
            ์กฐํ•ฉ(๋Ž์Šค + 1, ์ธ๋ฑ์Šค + 1)
        }
    }
}
var res = Array(repeating: 0, count: M)

func solution(_ depth: Int, _ begin: Int) {
    if depth == M {
        print(res.map {String($0)}.joined(separator: " "))
    } else {
        for i in begin..<N {
            res[depth] = i + 1
            solution(depth + 1, i + 1)
        }
    }
}

solution(0, 0)

 

 

 

-

๊ณ ๋“ฑํ•™์ƒ๋•Œ ์—ด์‹ฌํžˆ ํ™•๋ฅ ๊ณผ ํ†ต๊ณ„ ๊ณต๋ถ€ํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚˜์„œ, ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฑฐ ๊ฐ™๋‹ค..!

์ด์ „๊นŒ์ง€๋Š” ์ˆœ์—ด ์กฐํ•ฉ Swift ์ฝ”๋“œ๋งŒ ์ƒ๊ฐํ•˜๊ณ  ๋งˆ์ฃผํ•˜๊ธฐ ์•ฝ๊ฐ„ ๋ง์„ค์—ฌ์กŒ๋Š”๋ฐ, ์ด์ œ๋Š” ์ˆ˜ํ•™๋ฌธ์ œ ํ‘ธ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฟŒ์‹œ๋Š” ์žฌ๋ฏธ๊ฐ€ ์žˆ๋‹ค ๐ŸŒ

์ง€๋‚˜๊ณ  ๋ณด๋ฉด ๋ฌด์—‡์ด๋“  ๋‹ค ์ด์œ ์žˆ๋Š” ํ•™์Šต์ธ ๊ฒƒ ๊ฐ™๋‹ค ๐Ÿ’ช๐Ÿผ

728x90