[프로그래머스 kotlin] 괄호 회전하기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제



주어진 문자열을 회전하며 괄호가 적절한지 검사하는 문제이다.


풀이

이 문제는 총 2가지의 로직을 시행해야 한다.

1. 문자열을 회전

2. 회전된 문자열이 올바른 괄호조합인지 검사.

 

먼저 문자열은 다음과 같이 회전시켰다.

 

for (i in s.indices) {
    val tmp = s.substring(i) + s.substring(0, i)
    count += check(tmp)
    }

s는 받아온 문자열이다.

이 때 s.indices 즉 문자열의 길이만큼 반복한다.

반복시 s.substring(i) + s.substring(0, 1)의 문자열을 생성하는데

s.substring(i) 는 i번째부터 문자를 받아온다는 의믹도

s.substring(0, i)는 처음부터 i-1번째 까지의 문자를 가져온다는 의미이다.

즉 해당 방법을 사용하면 문자열을 회전시킬 수 있다.

 

회전한 문자열은 check함수로 보내진다.

 

 

fun check(s: String) : Int {
        val stack = mutableListOf<Char>()
        for (i in s) {
            when(i) {
                '[', '{', '(' -> stack.add(i)
                ']' -> if (stack.isNotEmpty() && stack.last() == '[') {
                    stack.removeLast()
                } else {
                    return 0
                }
                '}' -> if (stack.isNotEmpty() && stack.last() == '{') {
                    stack.removeLast()
                } else {
                    return 0
                }
                ')' -> if (stack.isNotEmpty() && stack.last() == '(') {
                    stack.removeLast()
                } else {
                    return 0
                }
            }
        }
        if (stack.isEmpty()) {
            return 1
        } else {
            println("test")
            return 0
        }
    }

위는 체크함수부분이다.

check함수는 여는괄호와 닫는괄호에 따라 다르게 동작한다.

 

먼저 스택을 선언한다. 그 후 for과 when을 사용하여 받아온 문자열의 문자를 하나씩 검사한다.

 

만약 받아온 문자가 여는괄호 즉 [, (, { 중 하나라면 스택에 삽입한다.

 

닫는괄호가 나올경우에는 조금 다르게 동작하는데 만약 올바른 괄호 문자열이라면 닫는 괄호가 나왔을 때 스택 마지막 부분에

해당 닫는 괄호와 짝인 여는괄호가 나온다.

즉 ]라면 스택에 가장 윗부분에는 [ 가 있어야한다.

따라서 해당하는 닫는괄호와 맞는 짝을 찾아 만약 맞다면 스택에서 제거하고 맞지않다면 0을 return한다.

 

모든 반복을 마쳤을 때 stack에 남아있는 문자가 없다면 괄호 문자열이 올바른 것이므로 1을 return한다.

 

마지막으로 count가 괄호문자열의 개수가 된다.


코드

import java.util.*
class Solution {
    fun solution(s: String): Int {
        var answer: Int = -1
        var count = 0
        
        val stack: Deque<String> = ArrayDeque()
        
        for (i in s.indices) {
            val tmp = s.substring(i) + s.substring(0, i)
            count += check(tmp)
        }
        return count
    }
    
    fun check(s: String) : Int {
        val stack = mutableListOf<Char>()
        for (i in s) {
            when(i) {
                '[', '{', '(' -> stack.add(i)
                ']' -> if (stack.isNotEmpty() && stack.last() == '[') {
                    stack.removeLast()
                } else {
                    return 0
                }
                '}' -> if (stack.isNotEmpty() && stack.last() == '{') {
                    stack.removeLast()
                } else {
                    return 0
                }
                ')' -> if (stack.isNotEmpty() && stack.last() == '(') {
                    stack.removeLast()
                } else {
                    return 0
                }
            }
        }
        if (stack.isEmpty()) {
            return 1
        } else {
            println("test")
            return 0
        }
    }
}