백트래킹
15649 N과 M(1)
import Foundation
let input = readLine()!.split(separator: " ").map { Int($0)! }
let N = input[0], M = input[1]
var visited = [Bool](repeating: false, count: N+1) // 이미 뽑은 수는 제외하기 위해
// visited 배열은 길이가 N+1인 Bool 배열을, 모든 값을 false로 초기화한다.
func dfs(nums: [Int]) {
if nums.count == M {
nums.forEach { print($0, terminator: " ") }
print()
// nums 길이가 M이 되면, nums의 모든 요소를 출력한다
return
// 그 후 return 하여 탐색하지 않고 종료
}
for i in 1...N {
if !visited[i] {
visited[i] = true
dfs(nums: nums+[i])
// nums 배열에 i를 추가한 새로운 배열
// 이 재귀호출을 통해, 현재 숫자 i를 포함한 새로운 경로로 탐색을 계속 진행한다
visited[i] = false
// 재귀호출이 완료되면(더 이상 숫자를 선택하지 않고 모든 가능한 경로를 탐색한 후)
// visited[i]를 false로 설정하여, 숫자 i를 다시 선택하지 않은 상태로 되돌린다.
// 이는 다른 경로에서 숫자 i를 선ㅌ개할 수 있도록 하기 위함이다.
}
}
}
dfs(nums: [])
Swift
복사