문제 링크 (opens new window)

# 풀이

  1. 중복된 카드를 뽑을 수 있으므로 Set 자료구조를 활용하여 중복검사
  2. k개 선택하여 순서 배치를 하므로 순열 (nPk)
import Foundation

let n = Int(readLine()!)!
let k = Int(readLine()!)!

var set = Set<Int>()
var input: [Int] = []

for _ in 0..<n {
    input.append(Int(readLine()!)!)
}

func permutation<T>(_ elements: [T], _ k: Int) -> [[T]] {
    var ret: [[T]] = []
    var visited: [Bool] = .init(repeating: false, count: elements.count)

    func permut(_ now: [T]) {
        if now.count == k {
            ret.append(now)
            return
        }

        for i in 0..<elements.count {
            if visited[i] { continue }
            visited[i] = true
            permut(now + [elements[i]])
            visited[i] = false
        }
    }
    permut([])
    return ret
}

for permut in permutation(input, k) {
    var string = ""
    permut.forEach { string += String($0) }
    set.insert(Int(string)!)
}

print(set.count)