문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1
3 1
4 5 2
예제 출력 1
2
4
5
예제 입력 2
4 2
9 8 7 1
예제 출력 2
1 1
1 7
1 8
1 9
7 7
7 8
7 9
8 8
8 9
9 9
풀이 방법
위 그래프를 코드로 구현하고 DFS로 탐색하되 depth == 2 일 때 까지만 노드를 탐색하면 됩니다. depth == 2 가 되면 더이상 깊이 가지 않고 옆으로 넘어갑니다.
예를들면 (노드 1 탐색 -> 노드 1 탐색) 이제 다음 depth는 2가 됩니다. 그럼 이제 더이상 깊이 가지 않고 옆으로 갑니다. (1 -> 7)
코드
let NM = readLine()!.split(separator: " ").map{ Int(String($0))! }
let numbers = readLine()!.split(separator: " ").map{ Int($0)! }.sorted()
var answer = [String](repeating: "", count: NM[1])
var out = ""
func dfs(start: Int, depth: Int) {
// 깊이 들어가지 않도록 종료 조건
if depth == NM[1] {
out += answer.joined(separator: " ")
out += "\n"
return
}
// 옆으로 노드를 늘리기 위한 for문
for i in start..<numbers.count {
answer[depth] = String(numbers[i])
// 깊이 가기 위해 depth + 1, 자신의 노드(포함)이상 부터 탐색하기 위해 start = i
dfs(start: i, depth: depth + 1)
}
}
dfs(start: 0, depth: 0)
print(out)
반응형
'알고리즘 > 그래프 탐색(DFS)' 카테고리의 다른 글
백준 N과 M(9) - Swift (0) | 2022.03.17 |
---|---|
백준 15656 N과 M(7) - Swift (0) | 2022.03.13 |
백준 15655 N과 M (6) - Swift (0) | 2022.03.11 |
백준 15654 N과 M(5) - Swift (0) | 2022.03.11 |
백준 15652 N과 M(4) - Swift (0) | 2022.03.08 |