TIL #47

loci·2024년 6월 16일
0

TIL

목록 보기
45/103


괄호 회전하기

문자열 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
}
profile
편리한 개발자

0개의 댓글