Don't give up!

[프로그래머스] 괄호 회전하기(java) 본문

Coding Test/Programmers

[프로그래머스] 괄호 회전하기(java)

Heang Lee 2021. 5. 14. 14:31

코딩테스트 연습 - 괄호 회전하기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

어떻게 생각하고 문제를 풀었는가?

닫힌 괄호 문자가 열린 괄호 문자보다 먼저 나타나면 문자열은 올바른 괄호 문자열이라고 판단할 수 없으며 괄호 안에 다른 괄호가 들어있는 경우 가장 안쪽의 괄호는 열린괄호와 닫힌 괄호가 같이 존재해야 합니다.

따라서 처음 확인되는 닫힌 괄호는 열린 괄호 바로 다음의 인덱스에 위치하여야 함을 생각하였으며 올바르다고 판단된 열린 괄호와 닫힌 괄호는 검사에서 제외함으로서 외부 괄호가 올바른 괄호 문자열을 형성하고 있는지 판단할 수 있을 것이라고 생각하였습니다.

코드

import java.util.Stack;
class Solution {
    static Stack<Character> stack;
    public int solution(String s) {
        int answer = 0;
        for(int i=0; i<s.length();i++){
            String spined = s.substring(i) + s.substring(0,i);
            if(isCorrect(spined)) answer++;
        }
        return answer;
    }
    public boolean isCorrect(String str){
        stack = new Stack<>();
        for(var c : str.toCharArray()){
            switch(c){
                case '(','{','[':
                    stack.push(c);
                    break;
                case ')':
                    if(stack.empty() || stack.peek()!='(') return false;
                    stack.pop();
                    break;
                case '}':
                    if(stack.empty() || stack.peek()!='{') return false;
                    stack.pop();
                    break;
                case ']':
                    if(stack.empty() || stack.peek()!='[') return false;
                    stack.pop();
                    break;
            }
        }
        return stack.empty() ? true : false;
    }
} 

생각한 내용을 바탕으로 코드를 작성하였습니다.

괄호는 '( )', '{ }', '[ ]' 세가지가 모두 존재할 수 있습니다. 따라서 switch문을 통해 닫힌 괄호에 대응하는 열린 괄호를 찾도록 하였습니다.

Stack 자료구조에 열린괄호를 모두 넣고 가장 최근에 스택에 삽입한 열린 괄호가 닫힌 괄호에 대응하는 경우 pop함수를 통해 삭제함으로서 안쪽의 올바른 괄호를 제외하고 검사할 수 있도록 코드를 작성하였습니다.