Kotlin/Algorithm Problems

<프로그래머스> 괄호 회전하기(Lv.2)

re트 2023. 11. 15. 16:38
728x90

https://github.com/heesoo-park/ForCodeKata/tree/main/%EA%B4%84%ED%98%B8%20%ED%9A%8C%EC%A0%84%ED%95%98%EA%B8%B0

https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

코딩 문제들을 풀다보면 한번은 보게 되는 괄호문제라서 익숙하게 다가왔다.

물론 회전이 들어가있어서 조...금 당황하긴 했지만 'Lv.2니까 그럴 수 있지'라며 넘어갔다.

그리고 그 회전이 이 문제에서는 가장 큰 산이 아니었나 싶다.

 


'어짜피 한 방향으로만 회전을 하는 거고 배열 자체를 돌리기에는 소모값이 너무 많으니까 어떻게든 인덱스를 가지고 해결을 해야겠는데...'

'아! 나머지 연산쓰면 되겠다!'

 


 

생각보다 회전에 대한 구현은 나머지 연산으로 인해서 쉽게 해결되었다.

이후 조건문들도 값을 체크하고 스택에 삽입, 삭제를 진행하는 것들이라 쉬웠다.

그리고 당당히 제출한 결과!! 실패였다.

 

실패로 알게 된 것은 Kotlin 자체에는 Stack()이 없다는 거였다.

import java.util.Stack이 필요하더라...

또 알게 된 것은 내가 짠 조건문으로 인한 예외사항 처리가 없다는 거였다.

나는 왼쪽 괄호만 스택에 넣고 오른쪽 괄호는 왼쪽 괄호를 빼내는 역할을 했는데, 오른쪽 괄호가 연달아 나오는 경우처럼 스택이 채워지지 않아서 스택이 비어있는데 이걸 올바른 괄호열로 인식하는 경우가 있었다.

(*실패한 코드는 깃허브에 올라가있다.)

 

이 부분을 고치고 제출했더니 자연스럽게 성공했다.

해당 방법으로 작성한 코드는 다음과 같다.

import java.util.Stack

class Solution {
    fun solution(s: String): Int {
        var answer: Int = 0
        val len = s.length
        val stack = Stack<Char>()

        for (i in 0 until len) {
            var mathces: Int = 0
            for (idx in s.indices) {
                var curIdx = (idx + i) % len
                if (s[curIdx] == '[' || s[curIdx] == '(' || s[curIdx] == '{') {
                    stack.push(s[curIdx])
                }
                else {
                    if (stack.isNotEmpty()) {
                        if (s[curIdx] == ']' && stack.peek() == '[') {
                            stack.pop()
                            mathces++
                        }
                        else if (s[curIdx] == ')' && stack.peek() == '(') {
                            stack.pop()
                            mathces++
                        }
                        else if (s[curIdx] == '}' && stack.peek() == '{') {
                            stack.pop()
                            mathces++
                        }
                    }
                }
            }

            if (stack.isEmpty() && mathces * 2 == s.length) answer++
            else stack.clear()
        }

        return answer
    }
}

(이번에 풀 때는 Stack()을 이용해서 풀었지만 다음에는 다른 방식으로 Stack을 구현하여 풀어봐야겠다.)

(예외처리는 언제나 생각지 않은 곳에서 나온다...)

반응형