코딩테스트 연습

프로그래머스 월간 코드 챌린지 - 괄호 회전하기(3)

고유빙글 2021. 5. 1. 21:15
import java.util.Stack;

class Solution {
    public int solution(String s) {
            int answer = 0;

        String[] s_arr = s.split("");
        String temp = "";
        int flag = 0;
        boolean flag1 = false;
        boolean flag2 = false;
        boolean flag3 = false;

        Stack<String> stack1 = new Stack<String>();
        Stack<String> stack2 = new Stack<String>();
        Stack<String> stack3 = new Stack<String>();

        while (flag < s.length()) {

            for (int i = 0; i < s_arr.length; i++) {

                if (s_arr[i].equals("(")) {
                    stack1.push(s_arr[i]);
                    flag1 = false;
                }
                if (s_arr[i].equals("{")) {
                    stack2.push(s_arr[i]);
                    flag2 = false;
                }
                if (s_arr[i].equals("[")) {
                    stack3.push(s_arr[i]);
                    flag3 = false;
                }

                if (s_arr[i].equals(")")) {
                    if (stack1.contains("(")) {
                        stack1.pop();
                        if(stack1.empty()) {
                            flag1 = true;
                        }
                    }
                }
                if (s_arr[i].equals("}")) {
                    if (stack2.contains("{")) {
                        stack2.pop();
                        if(stack2.empty()) {
                            flag2 = true;
                        }
                    }
                }
                if (s_arr[i].equals("]")) {
                    if (stack3.contains("[")) {
                        stack3.pop();
                        if(stack3.empty()) {
                            flag3 = true;
                        }
                    }
                }
            }

            while(stack1.empty()==false) {
                stack1.pop();
            }
            while(stack2.empty()==false) {
                stack2.pop();
            }
            while(stack3.empty()==false) {
                stack3.pop();
            }

                if (flag1 && flag2 && flag3) {
                    answer++;
                    flag1 = false;
                    flag2 = false;
                    flag3 = false;
                }


            temp = s_arr[0];
            for (int i = 0; i < s_arr.length; i++) {

                if (i == s_arr.length - 1) {
                    s_arr[i] = temp;
                } else {
                    s_arr[i] = s_arr[i + 1];
                }
            }

            flag++;
        }


        return answer;
    }
}

드디어 풀었따....

 

질문을 통해 반례를 받았는데 생각해보니

여러번의 괄호가 나올때 중간단계에서 한번 true로 변환된것이 다시 반쪽만 나왔을때 false로 처리된 이후에 다시 검증을 해야하는 것을 간과했다.

 

다른 정답들을 보니 역시 코드가 굉장히 길지만..그래도 성공해냈다는 것에 우선 매우 기쁘다 다른 분을의 답들을 보며 

좀 더 공부해야겠다.

 

스텍을 이론으로만 배우고 만들어보고 그랬었는데 스택이 자바에서 제공하는 객체에있는지 모르고 처음 써보았는데 무척 재밌다.