Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 15649๋ฒˆ - N๊ณผ M(1) (feat. DFS, ๋ฐฑํŠธ๋ž˜ํ‚น)

๊ฐ์ž ๐Ÿฅ” 2023. 1. 10. 12:31
๋ฐ˜์‘ํ˜•

๐ŸŸ  ๋ฌธ์ œ

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

 

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

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

www.acmicpc.net

 

๐ŸŸ  ๋‚ด๊ฐ€ ํ‘ผ ํ’€์ด

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๊ฐ์„ ์žก์ง€ ๋ชปํ–ˆ๋‹ค. ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํƒ์ƒ‰ํ•ด์„œ ์ถœ๋ ฅํ•ด์ฃผ์–ด์•ผํ•˜๋‚˜? ๊ณ ๋ฏผํ–ˆ๋‹ค. (์ฝ”ํ…Œ์Šคํ„ฐ๋””์—์„œ ํ’€์—ˆ๋˜ ๋ฌธ์  ๋ฐ ์ „ํ˜€ ๊ธฐ์–ต์ด ๋‚˜์งˆ ์•Š์•˜๋‹ค.)

๊ฒฐ๊ตญ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํžŒํŠธ๋ฅผ ์–ป๊ณ ์ž ์ธํ„ฐ๋„ท์„ ์กฐ๊ธˆ ์ฐพ์•„๋ณด์•˜๋‹ค. DFS์™€ ๋ฐฑํŠธ๋ž˜ํ‚น ๊ฐœ๋…์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์˜€๋‹ค.

๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ฉด, ์™œ DFS๋กœ ํ‘ธ๋Š”์ง€๋Š” ์ดํ•ด๊ฐ€ ๋˜๋Š”๋ฐ, ๋ฐฑํŠธ๋ž˜ํ‚น ๊ฐœ๋…์ด ๋“ค์–ด๊ฐ„๊ฒŒ ๋งž๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ์žฌ๊ท€๋ฅผ ๋Œ๋‹ค๊ฐ€ ํ˜„์žฌ ๋‚ด๊ฐ€ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” i ์— ๋Œ€ํ•ด์„œ ํฌํ•จ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ณผ์ •์ด ๋ฐฑํŠธ๋ž˜ํ‚น์ธ๊ฑด๊ฐ€?  (๋ฐฑํŠธ๋ž˜ํ‚น = ์™„์ „ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๊ณ  ์–ด๋Š ์กฐ๊ฑด์„ ์ •ํ•ด์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ) ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋˜์ƒˆ๊ฒจ๋ณด๋ฉด ๋งž์„ ์ˆ˜๋„..?

์žฌ๊ท€๋กœ DFS๋ฅผ ํ‘ธ๋Š”๊ฒƒ์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋ฆผ์„ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ทธ๋ฆฌ๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

์„ค๊ณ„๋ฅผ ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.  ์žฌ๊ท€๋Š”,,, ๋Œ์•„ ๋Œ์•„ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์ƒ๊ฐํ•ด์•ผ ํ’€๋ฆฐ๋‹ค... (์•„์ง ๋„ˆ๋ฌด ๋ถ€์กฑํ•˜๋‹ค ใ…Žํ—คใ…”ํ—ค)

์ด ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋‹ค์Œ๊ณผ๊ฐ™๋‹ค.

 

๐ŸŸ  ์ •๋‹ต์ฝ”๋“œ

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()
๋ฐ˜์‘ํ˜•