본문 바로가기
코딩테스트 준비(kotlin)/자료구조

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

by 1chanhue1 2024. 6. 18.

 

문제 풀이 시간 : 20분, 틀린 횟수 : 1번 (스택에 괄호가 남아 있는 경우를 고려하지 않음 ->  경우 예시 ((((, [[{]] 이런 상황  )

 

문제 해결 point

1. 배열에서 열린 문자를 만난다면 스택에 넣기 ' ( ' , ' { ' , '  [ '  경우에 해당한다. 


2. 배열에서 닫힌 문자를 만난다면 2가지 경우의 수. 

- 스택이 비어 있는 경우 -> 올바른 괄호 문자열을 만들 수 없음!

ex)        문자열이      "( ( } ) )" 이런 상황일때 발생 할 수 있다. 

- 스택에서 pop한 값과 비교해서 한 쌍인지 맞춰보기 , 만약 한 쌍이 아니라면 올바른 괄호 문자열을 만들 수 없음! 

올바른 괄호 문자열을 만들 수 있는 상황 

ex)      스택에서 pop한 값이 ' ) ' 이면 ' ( ' 를 만나야 함

ex)      스택에서 pop한 값이 ' } ' 이면 ' { ' 를 만나야 함          

ex)      스택에서 pop한 값이 ' ] ' 이면 ' [ ' 를 만나야 함

올바른 괄호 문자열을 만들 수 없는 상황

ex).  스택에서 pop한 값이 ' ] ' 인데 ' ( ' 인 경우 


3. 반복문이 다 끝난 상황인데 스택이 비어있지 않은 경우 올바른 괄호 문자열을 만들 수 없다 

ex)      "[ [ ] ] [ [ " 이런 문자열일 경우 발생 할 수 있다. stack에 아직 ' [ ' , ' [ ' 두 개가 남아 있게 된다. 

 

작성 코드  

import java.util.Stack //Stack import 하기 

fun solution_o(s: String): Int {
    var answer: Int = -1
    
    var array = s.toCharArray()
    
    var count=0

    for (i in 0 until array.size) {

        var stack = Stack<Char>()
        var check = 0

        for (j in 0 until array.size) { // array[(i + j) % array.size 나머지 연산자를 사용하여 탐색 할 수 있도록 했다. 
            if (array[(i + j) % array.size] == '(' || array[(i + j) % array.size] == '{' || array[(i + j) % array.size] == '[') {
                stack.push(array[(i + j) % array.size])
            } else {
                if (stack.empty()) {
                    check = 1
                    break
                }
                var value = stack.pop()
                if (value == '(') {
                    if (array[(i + j) % array.size] == ')')
                        continue
                    else{
                        check=1
                        break
                    }
                }
                if(value == '{') {
                    if (array[(i + j) % array.size] == '}')
                        continue
                    else{
                        check=1
                        break
                    }
                }
                if (value == '[') {
                    if (array[(i + j) % array.size] == ']')
                        continue
                    else{
                        check=1
                        break
                    }
                }
            }

        }

        if(check==0&&stack.empty()){
            count++
        }

    }

    return count
}