코딩테스트(코틀린) 기초부터 연습

프로그래머스 괄호변환

리워크 2021. 4. 16. 15:08
class Solution {
    fun solution(p: String): String {
        var answer = ""
        answer=solute(p)
        println(answer)
        return answer
    }

    /**true면 올바른 문자열*/
    fun checkIsPerfect(s: String): Boolean {
        var checkNum = 0
        for (i in s) {
            when (i) {
                '(' -> {
                    checkNum++
                }
                else -> {
                    checkNum--
                }
            }
            if (checkNum < 0) return false
        }
        return true
    }

    fun divideChar(s: String): Pair<String,String> {
        var checkNum = 0
        var position = 0
        for (i in s) {
            position++
            when (i) {
                '(' -> {
                    checkNum++
                }
                else -> {
                    checkNum--
                }
            }
            if (checkNum == 0) break
        }
        val u = s.slice(0 until position)
        val v = s.slice(position  until s.length)
        return u to v
    }

    fun solute(s:String) : String{
        if(s =="") return ""
        val divided = divideChar(s)
        if (checkIsPerfect(divided.first)){ // u가 완벽함
            return divided.first + solute(divided.second)
        }else{//완벽하지 못함

            val newU = String(divided.first.subSequence(1,divided.first.lastIndex).map {
                when(it){
                    '('->{
                        ')'
                    }else->{
                    '('
                }
                }
            }.toCharArray())
            return "("+solute(divided.second)+")" +newU

        }
    }
}

괄호안이 완벽한 문자열인지 확인하고 재귀함수를 통해서 이어줌