https://www.acmicpc.net/problem/15655
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이
import java.util.StringTokenizer
fun main() = with(System.`in`.bufferedReader()) {
val (n, m) = readLine().split(" ").map { it.toInt() }
val st = StringTokenizer(readLine())
val arr = IntArray(n) {
st.nextToken().toInt()
}.sorted()
val sb = StringBuilder()
val saveSb = StringBuilder()
fun dfs(depth: Int,beforeIdx:Int) {
if (depth == m) {
sb.appendLine(saveSb.toString())
return
}
for (i in beforeIdx until arr.size) {
val start = saveSb.length
saveSb.append(" ").append(arr[i])
dfs(depth + 1,i+1)
saveSb.deleteRange(start,saveSb.length)
}
}
for (i in arr.indices){
saveSb.append(arr[i])
dfs(1,i+1)
saveSb.clear()
}
print(sb.toString())
}
- dfs 알고리즘을 사용하는 것은 이전의 풀이와 같지만 나왔던 수같은경우에는 다시 나오면 안되기때문에 index를 매개변수에 넣어서 그이후의 arr의 값만 사용할수있게 변경하였습니다.
결과
'코틀린 > 백준' 카테고리의 다른 글
[백준] - N과 M (5)(Kotlin) (1) | 2023.11.11 |
---|---|
[백준] - 스택 2(Kotlin) (0) | 2023.08.29 |