๊ธ€ ์ž‘์„ฑ์ž: ์ด์ง€์›๐ŸŒฉ๏ธ

์ค‘๋ณต์—†์ด ๋ฐฉ๋ฌธ ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์—์„œ N๊ณผ M (1)๊ณผ ๋™์ผํ•˜๊ฒŒ visited ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ฒดํฌํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฌธ์ œ๋Š” ์ˆœ์ฐจ์ ์ธ ์ˆซ์ž์˜ ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆซ์ž๋“ค์˜ ์กฐํ•ฉ์„ ๊ตฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด ๋Œ€์‹  ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ํ’€์—ˆ๋‹ค.


๋ฌธ์ œ

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


๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

Swift

let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = input[0]
let m = input[1]
let nums = readLine()!.split(separator: " ").map { Int(String($0))! }.sorted()
var picked = [String]()
var visited = [Int: Bool]()
for num in nums {
    visited[num] = false
}
/*
 n: ์ „์ฒด ์›์†Œ์˜ ์ˆ˜
 picked: ์ง€๊ธˆ๊นŒ์ง€ ๊ณ ๋ฅธ ์›์†Œ๋“ค์˜ ๋ฒˆํ˜ธ
 toPick: ๋” ๊ณ ๋ฅผ ์›์†Œ์˜ ์ˆ˜
 ์ผ ๋•Œ, ์•ž์œผ๋กœ toPick๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ณ ๋ฅด๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ถœ๋ ฅํ•œ๋‹ค
 */
func pick(n: Int, toPick: Int) {
    // ๊ธฐ์ € ์‚ฌ๋ก€: ๋” ๊ณ ๋ฅผ ์›์†Œ๊ฐ€ ์—†์„ ๋•Œ ๊ณ ๋ฅธ ์›์†Œ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค.
    if toPick == 0 {
        print(picked.joined(separator: " "))
        return
    }
    // ์›์†Œ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅธ๋‹ค.
    for next in 0..<n {
        // ๋ฐฉ๋ฌธํ•œ ์›์†Œ๋Š” ๊ฑด๋„ˆ๋›ด๋‹ค.
        if visited[nums[next]]! {
            continue
        }
        visited[nums[next]] = true
        picked.append(String(nums[next]))
        pick(n: n, toPick: toPick - 1)
        picked.removeLast()
        visited[nums[next]] = false
    }
}

pick(n: n, toPick: m)
๋ฐ˜์‘ํ˜•