괄호 회전하기
문자열 s의 길이횟수만큼 문자열을 회전시켜(맨앞문자가 맨뒤로) 괄호가 정상적으로 열리고 닫힌 케이스를 카운트해서 정상적 문자열이 몇번이 나오는지 반환해줘야한다.
처음에 when으로 열린괄호가 나오면 +해주고 닫히면 -해주는 식으로 풀다가 해결이 잘안되고 시간이 오버되 다른사람의 풀이를 참고해 스택식으로 바꿔 풀었다.
class Solution {
fun solution(s: String): Int {
var answer: Int = 0
var s = s
for(i in 0 until s.length){
var stack = mutableListOf<Char>()
var b = true
for(j in s.indices){
when(s[j]){
'(' -> {
stack.add(s[j])
}
'{' -> {
stack.add(s[j])
}
'[' -> {
stack.add(s[j])
}
')' -> {
if(stack.isEmpty() || stack.removeAt(stack.size-1) != '(') b = false
}
'}' -> {
if(stack.isEmpty() || stack.removeAt(stack.size-1) != '{' ) b = false
}
']' -> {
if(stack.isEmpty() || stack.removeAt(stack.size-1) != '[') b = false
}
}
}
if(b && stack.isEmpty()){
answer++
}
s += s[0].toString()
s = s.substring(1)
}
return answer
}
}
break를 추가하고 문자열 회전로직을 변경해봄
class Solution {
fun solution(s: String): Int {
var answer: Int = 0
var s = s
for(i in 0 until s.length){
var stack = mutableListOf<Char>()
var b = true
for(j in s.indices){
when(s[j]){
'(','{','[' -> {
stack.add(s[j])
}
')' -> {
if(stack.isEmpty() || stack.removeAt(stack.size-1) != '(') {
b = false
break
}
}
'}' -> {
if(stack.isEmpty() || stack.removeAt(stack.size-1) != '{' ) {
b = false
break
}
}
']' -> {
if(stack.isEmpty() || stack.removeAt(stack.size-1) != '[') {
b = false
break
}
}
}
}
if(b && stack.isEmpty()){
answer++
}
s = s.drop(1) + s.first()
}
return answer
}
}
다른사람 풀이
fun solution(s: String): Int {
var answer = 0
var str = s
fun isValid(s: String): Boolean {
val stack = mutableListOf<Char>()
for (c in s) {
when (c) {
'(', '[', '{' -> stack.add(c)
')' -> if (stack.isEmpty() || stack.removeAt(stack.size - 1) != '(') return false
']' -> if (stack.isEmpty() || stack.removeAt(stack.size - 1) != '[') return false
'}' -> if (stack.isEmpty() || stack.removeAt(stack.size - 1) != '{') return false
}
}
return stack.isEmpty()
}
fun rotateLeft(s: String) = s.substring(1) + s.first()
for (i in str.indices) {
if (isValid(str)) answer++
str = rotateLeft(str)
}
return answer
}