[백준] 괄호의 값 (2504)(kotlin)

문제 설명

백준 2504번 문제 링크

입력 및 출력

» 입력

첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.

» 출력

첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.

예제 입출력(테스트케이스)

입력 출력
(()[[]])([]) 28
[][]((]) 0

문제 풀이1

풀이 참고

import java.util.*
import kotlin.system.exitProcess

fun main() = with(System.`in`.bufferedReader()) {
    val str = readLine()
    val stack = Stack<String>()
    var isAble = true

    for (i in str.indices) {
        if (str[i] == '(') {
            stack.push(")")
            continue
        }

        if (str[i] == '[') {
            stack.push("]")
            continue
        }

        var num = 0
        while (true) {
            if (stack.isEmpty()) {
                isAble = false
                break
            }

            if (isNumber(stack.peek())) {
                num += stack.pop().toInt()
            } else {
                if (isVPS(str[i], stack.peek())) {
                    stack.pop()
                    val t = if (str[i] == ')') 2 else 3

                    if (num == 0) {
                        stack.push(t.toString())
                    } else {
                        stack.push((t * num).toString())
                    }
                    break
                } else {
                    isAble = false
                    break
                }
            }
        }
        if (!isAble) break
    }

    var ans = 0
    while (!stack.isEmpty()) {
        if (isNumber(stack.peek())) {
            ans += stack.pop().toInt()
        } else {
            println(0)
            return exitProcess(0)
        }
    }

    println(ans)
}

fun isVPS(c: Char, target: String): Boolean = c.toString() == target
fun isNumber(c: String): Boolean = c != ")" && c != "]"