https://www.acmicpc.net/problem/15654
15654번: N과 M (5)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 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 7
1 8
1 9
7 1
7 8
7 9
8 1
8 7
8 9
9 1
9 7
9 8
풀이 방법
예제 2의 입력과 출력을 보면 이러한 형태의 그래프가 그려져야 합니다.
위의 그래프를 DFS로 탐색을 할 것입니다.
DFS는 그래프의 모든 노드를 탐색할 때 까지 끝나지 않습니다.
그런데 예제 2의 출력을 보면 중첩은 불가능 하기 때문에 이미 한번 다녀간 곳은 더 이상 탐색할 필요가 없습니다.
위의 상황을 코드로 짜면
코드
var NM = readLine()!.split(separator: " ").map{ Int($0)! }
var numbers = readLine()!.split(separator: " ").map{ Int($0)! }.sorted()
var answer = [Int](repeating: 0, count: NM[1])
var str = ""
var visited = [Bool](repeating: false, count: NM[0])
func dfs(depth: Int) {
if depth == NM[1] {
str += answer.map{ String($0) }.joined(separator: " ")
str += "\n"
return
}
// 같은 depth, 옆으로 노드를 늘리기 위한 for문
for i in 0..<numbers.count {
// 방문하지 않았을 때만 탐색을 이어나감
if !visited[i] {
visited[i] = true
answer[depth] = numbers[i]
// 깊이 있게 탐색하기 위해 depth + 1
dfs(depth: depth + 1)
visited[i] = false
}
}
}
func sol() {
dfs(depth: 0)
}
sol()
print(str)
반응형
'알고리즘 > 그래프 탐색(DFS)' 카테고리의 다른 글
백준 15656 N과 M(7) - Swift (0) | 2022.03.13 |
---|---|
백준 15655 N과 M (6) - Swift (0) | 2022.03.11 |
백준 15652 N과 M(4) - Swift (0) | 2022.03.08 |
백준 15651 N과 M(3) - Swift (0) | 2022.03.08 |
백준 15650 N과 M(2) - Swift (0) | 2022.03.06 |