문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=kotlin
문제
나의 풀이
이 문제에는 친절하게도 다시 수행하라는 식으로 재귀함수를 사용해야 한다는 것을 알려주고 있다. 다만 문자열이 "올바른 괄호 문자열" 인지 판별하는 부분이 조금 헷갈렸는데 stack을 사용해서 '(' 일때 add 해주고 ')' 일때 pop을 해주는 방식을 통해 문자열이 올바른지 올바르지 않은지 판별했다.
import java.util.*
class Solution {
fun solution(p: String): String {
return if(p.isEmpty()) p
else divide(p)
}
fun isRight(p: String): Boolean {
val stack = Stack<Char>()
for(element in p){
if(element == '(')
stack.add('(')
else{
if(stack.isEmpty()) return false
else stack.pop()
}
}
return true
}
fun divide(answer: String): String {
var result = ""
var count = 0
var u = ""
var v = ""
if(answer.isEmpty()) return result
run {
answer.toCharArray().mapIndexed { i, a ->
u += a
if(a == '(') count++
else count--
if(count == 0) {
v = answer.substring(i + 1, answer.length)
return@run
}
}
}
if(isRight(u)) {
result += u
result += divide(v)
}
else {
u = u.substring(1, u.length - 1)
var uu = ""
u.toCharArray().map {
if(it == '(') uu += ")"
else uu += '('
}
result = result + "(" + divide(v) + ")" + uu
}
return result
}
}