[백준] 괄호의 값 (2504)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 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 != "]"