요깨비's LAB

[프로그래머스, Kotlin] 괄호 변환 본문

알고리즘(Kotlin)/Simulation

[프로그래머스, Kotlin] 괄호 변환

요깨비 2021. 3. 31. 20:48

말 그대로 아래 설명대로 구현하면 되는 문제였습니다. 따로 설명은 필요없을 것 같습니다.

import java.util.*

class Solution {
    fun solution(p: String): String {
        var answer = ""

        answer = doAlgorithm(p)

        return answer
    }

    fun doAlgorithm(p: String): String {
        var str = ""
        if (p == "")
            return ""

        var index = divideString(p)
        var u = getU(p, index)
        var v = getV(p, index)
//        println("u=$u v=$v")

        if(checkIsCorrectString(u)) {
            str += u
            str += doAlgorithm(v)
        }else {
            str += "("
            str += doAlgorithm(v)
            str += ")"

            var carr = u.toList()
            var index = 0
            var lastIndex = carr.size
            var sb = StringBuffer()
            for(c in carr) {
                if(index ==0 || index == lastIndex-1) {
                    index++
                    continue
                }

                if(c == '(')
                    sb.append(')')
                if(c == ')')
                    sb.append('(')
                index++
            }

            str += sb.toString()
        }

        return str
    }

    fun checkIsCorrectString(u: String): Boolean {
        val stack = Stack<Char>()
        var isCorrect = true

        u.forEach {
            if(it == ')') {
                if(stack.empty()) {
                    isCorrect = false
                    return@forEach
                }else {
                    stack.pop()
                }
            }else {
                stack.push(it)
            }
        }

        return isCorrect
    }

    fun divideString(p: String): Int {
        var left = 0
        var right = 0
        var index = 1
        for(it in p) {
            if (it == '(')
                left++

            if (it == ')')
                right++

            if (left > 0 && right > 0 && left == right) {
                break
            }

            index++
        }

        return index
    }

    fun getU(p: String, index: Int): String {
        return p.substring(0, index)
    }

    fun getV(p: String, index: Int): String {
        return p.substring(index)
    }
}
Comments