Kotlin-Combination-Implementation

코틀린을 활용한 알고리즘 문제를 풀다가 경우의 수와 관련된 문제들이 자주 나와서 이를 쉽게 풀어나가기 위한 클래스를 만들어 보았다. 필요할 때가 활용하면 유용할 것 같다.

class CaseFactory(val valueList: Array<String>){

    private val visit = BooleanArray(valueList.size)

    private var caseResult = mutableListOf<List<String>>()

    private var combinationFlag = false

    private var targetSize = 0



    fun setCombinationFlag(value: Boolean){

        combinationFlag = value

    }



    fun setTargetSize(value: Int){

        targetSize = value

    }



    fun build(): List<List<String>>{

        caseResult.clear()

        if (targetSize <= valueList.size){

            if (combinationFlag){

                combination(valueList, visit, 0, valueList.size, targetSize)

            }

            else {

                permutation(valueList, 0, valueList.size, targetSize)

            }

        }

        return caseResult

    }



    private fun permutation(array: Array<String>, depth:Int, n: Int, r: Int){

        if (depth==r){

            val list = array.toList().take(r)

            caseResult.add(list)

            return

        }

        else {

            for (i in depth until n){

                array[i] = array[depth].also { array[depth] = array[i] }

                permutation(array, depth+1, n, r)

                array[i] = array[depth].also { array[depth] = array[i] }

            }

        }

    }



    private fun combination(arr: Array<String>, visited: BooleanArray, index: Int, n: Int, r: Int){

        if (r == 0){

            val result = mutableListOf<String>()

            for (i in visited.indices){

                if (visited[i]) result.add(arr[i])

            }

            caseResult.add(result)

        }

        else {

            for (i in index until n){

                visited[i] = true

                combination(arr, visited, i+1, n, r-1)

                visited[i] = false

            }

        }

    }

}

SulfurBottom
Written by@SulfurBottom
Front-End Developer. Like Develop, Travel, Friend.

GitHubLinkedIn