์ค๋ณต์์ด ๋ฐฉ๋ฌธ ํด์ผํ๋ค๋ ์ ์์ 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)