본문 바로가기

알고리즘(w.KOTLIN)/백트래킹

[백준][KOTLIN][15652] N과 M(4)

728x90

https://www.acmicpc.net/problem/15652

 

15652번: N과 M (4)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

문제 풀이

1. dfs 를 이용하여 주어진 입력 N, M 에 대해서 탐색한다.

2. 이때 숫자를 중복해서 사용해도 되기 때문에 visit 배열을 사용하지 않는다.

3. 비내림차순순열이어야 하기 때문에 현재 arr 의 마지막 값이 탐색하는 index 보다 작거나 같으면 arr 에 값을 넣고 dfs 를 수행하고 크면 dfs 를 수행하지 않고 다음 index 를 탐색한다.

4. M 과 depth 의 값이 같을 때 arr 를 출력한다.

코드

import java.io.BufferedReader
import java.io.InputStreamReader

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val (N, M) = br.readLine().split(" ").map { it.toInt() }
    dfs(N, M, 0, mutableListOf())
}

private fun dfs(N: Int, M: Int, depth: Int, arr: MutableList<Int>) {
    if (M == depth) {
        for (a in arr) {
            print("$a ")
        }
        println()
        return
    }

    for (i in 1..N) {
        if (arr.isEmpty()) {
            arr.add(i)
        } else {
            if (arr.last() <= i) {
                arr.add(i)
            } else {
                continue
            }
        }
        dfs(N, M, depth + 1, arr)
        if (arr.isNotEmpty()) arr.removeLast()
    }
}
728x90