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

Algorithm/Baekjoon

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

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

๐ŸŸ  ๋ฌธ์ œ

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

 

15650๋ฒˆ: N๊ณผ M (2)

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

www.acmicpc.net

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

์•ž์„œ ํ’€์—ˆ๋˜ N๊ณผ M(1) ๊ณผ ๋น„์Šทํ•˜๋‹ค. [1,2]์™€ [2,1]์„ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ํ–‡๋˜ (1)๋ฒˆ ๋ฌธ์ œ์™€๋Š” ๋‹ฌ๋ฆฌ (2)๋ฒˆ ๋ฌธ์ œ๋Š” [1,2] ํ•˜๋‚˜๋งŒ, ์ฆ‰ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋‹ต ํ•˜๋‚˜๋งŒ ์ทจ๊ธ‰ํ•ด์•ผํ•œ๋‹ค. 

์–ด์ œ DFS๊ด€๋ จํ•ด์„œ ํ—ค๋งธ๋˜๊ฒŒ ๋‚˜๋ฆ„ ์ถฉ๊ฒฉ์ด์—ˆ์–ด์„œ ๋จธ๋ฆฟ์†์— ๋ช‡๋ฒˆ์ด๊ณ  ๊ธฐ์–ตํ•˜๋ฉด์„œ ๋„ฃ์—ˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋Š” ์‰ฝ๊ฒŒ ์งค ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ๋“ค๋งŒ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒƒ์ธ๋ฐ,,, ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค. (๊ฒฐ๊ตญ ๋‘๊ฐ€์ง€๋ชจ๋‘ ํ‹€๋ ธ์ง€๋งŒ)

๐Ÿ”– stack์— ์Œ“์ด๋Š” ๊ฒƒ๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์ •๋ ฌํ•œ ํ›„, Set์œผ๋กœ ์ค‘๋ณต์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ž.

์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋‹ต์ด ๋‚˜์˜ค๊ธด ํ•  ๊ฑฐ๋‹ค. (1)๋ฒˆ๊ณผ ๊ฐ™์€ ํ’€์ด๋ฐฉ์‹์œผ๋กœ ํ’€์–ด์„œ, stack์„ ๋ฐ”๋กœ๋ฐ”๋กœ printํ•˜์ง€ ์•Š๊ณ , stack์— ๋ชจ๋‘ ์Œ“์•„๋‘์—ˆ๋‹ค๊ฐ€, ๋‚˜์ค‘์— ์ถœ๋ ฅํ•˜๊ธฐ ์ „์— ์ •๋ ฌ ๋ฐ ์ค‘๋ณต์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ •๋ง, ๋ฐ”๋ณด๊ฐ™์ง€๋งŒ 1์ฐจ์›์ ์œผ๋กœ ๊ฐ€์žฅ ๋จผ์ € ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, DFS๋กœ ํ’€์–ด๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์ด ์ปธ๋‹ค. ์ด๋ ‡๊ฒŒ ํ’€๋ฉด 100%ํ’€๋ฆด๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ์ด ๋“ค์—ˆ๊ณ , ์‹œ๊ฐ„์ œํ•œ๋„ ์ถฉ๋ถ„ํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ‘ธ๋Š” ๋ฐฉ์‹์€ ๋‚˜๋„ ์›ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ์ƒ๊ฐํ•ด๋‘๊ณ  ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค.

๐Ÿ”– visited๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ž..

์ด ๋ฐฉ์‹์€ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ํ’€๋ฆฌ์ง€ ์•Š์•„์„œ ๋ฒ„๋ ธ๋‹ค. ์™œ๋ƒ๋ฉด, 1๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•ด์„œ 1๋ฒˆ์— visited ์ฒ˜๋ฆฌ, 2๋ฒˆ์— visirted์ฒ˜๋ฆฌ,, ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€๋ฉด, ์˜ค๋ฆ„์ฐจ์ˆœ์ด์ง€๋งŒ ๋งŒ์•ฝ 2๋ถ€ํ„ฐ ๋ˆ๋‹ค์น˜๋ฉด, 1์— ๋ฐฉ๋ฌธํ•ด์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ์•ˆ๋˜์–ด์žˆ์œผ๋ฉด visited์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  stack์—๋„ฃ๊ณ .. ๊ฒฐ๊ตญ (1)๋ฒˆ๋ฌธ์ œ์™€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด๋‹ค... ํ•˜ํ•˜ํ•˜ํ•˜ ๊ฒฐ๊ตญ ๊ฐ™๊ตฐ.. 

๊ธฐ์กด (1)๋ฒˆ ํ’€์ด๋ฅผ ๋ณด๋ฉด, contains ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ stack์— ๋“ค์–ด์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ visited ์ฒ˜๋ฆฌ์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๊ตณ์ด visited ๋ฅผ ๋งŒ๋“ ๋‹ค ์ณ๋„,, ๋ณ„๋‹ค๋ฅธ ํ’€์ด๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

โœ… dfs์— ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’์„, ์ง€๊ธˆ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’๋ณด๋‹ค ํฐ๊ฐ’๋งŒ ์ทจ๊ธ‰ํ•ด๋ณด์ž.

๊ฒฐ๊ตญ, ์ธํ„ฐ๋„ท์—์„œ ์กฐ๊ธˆ์˜ ํžŒํŠธ๋ฅผ ์–ป์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์–ป์€ ํžŒํŠธ๋Š”, ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ๋“ค๋งŒ ์ทจ๊ธ‰ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 3๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉด ๊ตณ์ด 1๊ณผ 2๋Š” ์‚ดํŽด๋ณด์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, dfs๋ฅผ ์žฌ๊ท€๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ณผ์ •์—์„œ ํ˜„์žฌ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’๋“ค๋งŒ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋˜๋ฉด? ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ๋“ค๋งŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค!! 

 

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

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

var stack = [Int]()

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

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

dfs(start: 1)

 

๋ฐ˜์‘ํ˜•