๋๋ ์ด๋ค ์ ํ์ ์ ํํ๋ ์ฝ๋๋ฅผ ์ธ์ฐ๋ฉด, ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ๊ทธ ๋ฐฉ์์ ์์ฉํด์ ํผ๋ค. ๊ทธ๋์ ์ด ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๋นํจ์จ์ ์ธ ์ฝ๋๊ฐ ๋์๋ค. ์๊ฐ์ ๋ณด๋ ๋ค๋ฅธ ๋ถ์ ๋นํด ์ฝ 50๋ฐฐ๊ฐ ๋๋ ธ๋ค(…). ๊ทธ๋์ ๋ ๊ฐ๊ฒฐํ ์ฝ๋๊ฐ ๊ถ๊ธํด์ ์ดํด๋ณด์๋๋ฐ, ๊ตณ์ด ๋ฐฐ์ด์ ์ฐ์ง ์๊ณ , ๋ณ์์ ์ ์ฅํด์ ์ฌ๊ท๋ฅผ ๋๊ธฐ๊ณ (?), ํ๋ ๋ฐฉ์์ผ๋ก ํ๋๋ผ. ์๋ฌดํผ ์ด๊ฑด ๋์ค์ ๋ค์ ํ์ด๋ด์ผ๊ฒ ๋ค.
๋ฌธ์
https://www.acmicpc.net/problem/1182
๋ด๊ฐ ์์ฑํ ์ฝ๋
Swift
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = input[0]
let target = input[1]
let nums = readLine()!.split(separator: " ").map { Int(String($0))! }
var count = 0
var picked = [Int]()
var visited = Array(repeating: false, count: n)
func pick(toPick: Int, start: Int) {
if toPick == 0 {
if picked.reduce(0, +) == target {
count += 1
}
return
}
for i in start..<n {
if visited[i] {
continue
}
visited[i] = true
picked.append(nums[i])
pick(toPick: toPick - 1, start: i + 1)
picked.removeLast()
visited[i] = false
}
}
for i in 1...n {
pick(toPick: i, start: 0)
visited = Array(repeating: false, count: n)
}
print(count)