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

์ค‘๋ณต์—†์ด ๋ฐฉ๋ฌธ ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์—์„œ 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)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€

๋Œ“๊ธ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.