TLI/코드카타

2024.06.16 TIL 코트카타 84번 (괄호 회전하기)

jaeseonyoo 2024. 6. 16. 23:19
    fun solution(s: String): Int {
        var numCorrectRotate = 0
        var numRotate = 0
        val sToBuilder = StringBuilder(s)

        if(isCorrectBrakets(sToBuilder))
            numCorrectRotate++

        while (numRotate < s.length - 1) {
            sToBuilder.append(sToBuilder[0])
            sToBuilder.deleteCharAt(0)

            if(isCorrectBrakets(sToBuilder))
                numCorrectRotate++

            numRotate++
        }

        return numCorrectRotate
    }

    fun isCorrectBrakets(brackets: StringBuilder): Boolean{
        val bracketStack = Stack<Char>()
        val closeBrackets = mutableListOf(')','}',']')
        val closeToOpen = mutableMapOf(')' to '(', '}' to '{', ']' to '[')

        for (bracket in brackets) {
            if (bracket in closeBrackets) {
                if (bracketStack.isNotEmpty() && closeToOpen[bracket] == bracketStack.peek())
                    bracketStack.pop()
                else
                    return false
            } else
                bracketStack.push(bracket)
        }

        return bracketStack.isEmpty()
    }

 

풀이 과정

1. s의 괄호를 순서대로 스택에 push한다.

2. 닫는 괄호가 나왔을 때

   2.1. 스택이 비어있지 않고 이전 push한(peek한) 괄호가 쌍을 이루는 여는 괄호일 경우 pop한다.

   2.2. 아닐경우 잘못된 괄호 셋

3. s 전체를 돌았을 때 stack이 비어있으면 올바른 괄호 셋으로 count한다.

4. 왼쪽으로 한 칸씩 이동하며 2~3번의 과정을 반복한다.

 

포인트

- stack에서 닫는 괄호가 나왔을 때 쌍을 이루는 여는 괄호가 stack의 가장 위에 있어야 올바른 괄호 셋이 된다는 것을 활용한다.

- 중첩되는 괄호더라도 올바른 괄호 셋이라면 가장 안쪽 괄호부터 쌍에 맞춰져 stack에 push되었기 때문이다.