https://www.acmicpc.net/problem/15656
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)
둘째 줄에 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 1
7 7
7 8
7 9
8 1
8 7
8 8
8 9
9 1
9 7
9 8
9 9
풀이 방법
https://hongz-developer.tistory.com/184
와 똑같은 문제이길래 같은 코드로 제출했습니다.
그런데 결과는 시간초과 -.. -
시간 초과난 코드
let NM = readLine()!.split(separator: " ").map{ Int($0)! }
let numbers = readLine()!.split(separator: " ").map{ Int($0)! }.sorted()
var answer = [Int](repeating: 0, count: NM[1])
var str = ""
func dfs(depth: Int) {
if depth == NM[1] {
str += answer.map{ String($0) }.joined(separator: " ")
str += "\n"
return
}
for i in 0..<numbers.count {
answer[depth] = numbers[i]
dfs(depth: depth+1)
}
}
dfs(depth: 0)
print(str)
어떻게 할까 하다가 answer부분에서 한번 dfs를 돌 때 마다 map을 하면 시간이 좀 걸릴수도 있겠다라는 생각이 들었습니다.
그래서 map을 하지 않고 넣을 때 아예 처음부터 answer을 String 타입 배열로 바꾸는 것으로 해결했습니다.
let NM = readLine()!.split(separator: " ").map{ Int($0)! }
let numbers = readLine()!.split(separator: " ").map{ Int($0)! }.sorted()
var answer = [String](repeating: "", count: NM[1])
var str = ""
func dfs(depth: Int) {
if depth == NM[1] {
// map 제거
str += answer.joined(separator: " ")
str += "\n"
return
}
for i in 0..<numbers.count {
// String 값으로 바꿈!
answer[depth] = String(numbers[i])
dfs(depth: depth+1)
}
}
dfs(depth: 0)
print(str)
반응형
'알고리즘 > 그래프 탐색(DFS)' 카테고리의 다른 글
백준 N과 M(9) - Swift (0) | 2022.03.17 |
---|---|
백준 15657 N과 M(8) - Swift (0) | 2022.03.16 |
백준 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 |