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

2023. 8. 31. 15:40Algorithm/프로그래머스

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항

 

s의 길이는 1 이상 1,000 이하입니다.

 

 


입출력 예

s result
"[](){}"  3
"}]()[{"  2
"[)(]"  0
"}}}"  0

 

입출력 예 설명

입출력 예 #1

다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.


올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
입출력 예 #2

다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.


올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
입출력 예 #3

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
입출력 예 #4

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.


풀이


사용 변수

  nt answer = 0;   //-> 정답
  ArrayDeque<Character> dq = new ArrayDeque<>(); //-> deque로 구현 
  ArrayDeque<Character> stack; // -> stack으로 괄호 판별
  boolean isValid = true;  //-> 정상적으로 닫혔는지

설명

초기 아이디어는 deque를 이용하여 풀이하였습니다. 

string 의 각 문자를 넣고, dq의 길이만큼 반복, 여는 괄호일 때에 스택에 추가, 닫는 괄호일 때에 스택에서 pop 해준 후에, 괄호를 회전해야 하므로, 판별 후에 바로 addLast를 통해 회전시켜 줬습니다.

하지만 이 과정에서 Null에러가 발생했고, 따라서 isValid 라는 boolean 형을 이용하여 정답여부를 관리했습니다. 

 

소스코드

 

package prgmrs;

import java.util.ArrayDeque;

public class 괄호회전하기 {

    public static void main(String[] args) {
        String s1 = "[](){}";
        System.out.println(solution(s1)); // 3
        String s2 = "}]()[{";
        System.out.println(solution(s2)); // 2
        String s3 = "[)(]";
        System.out.println(solution(s3)); // 0
        String s4 = "}}}";
        System.out.println(solution(s4)); // 0
    }

    static public int solution(String s) {
        int answer = 0;
        ArrayDeque<Character> dq = new ArrayDeque<>();
        ArrayDeque<Character> stack;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            dq.addLast(c);
        }

        for (int i = 0; i < dq.size(); i++) {
            stack = new ArrayDeque<>();
            boolean isValid = true;

            for (Character brks : dq) {
                if (brks == '(' || brks == '{' || brks == '[') {
                    stack.addLast(brks);
                } else {
                    if (stack.size() == 0) {
                        isValid = false;
                        break;
                    }
                    char close = stack.pollLast();

                    if (brks == ')' && close != '(') {
                        isValid = false;
                        break;
                    } else if (brks == '}' && close != '{') {
                        isValid = false;
                        break;
                    } else if (brks == ']' && close != '[') {
                        isValid = false;
                        break;
                    }
                }
            }

            if (stack.size() == 0 && isValid) {
                answer += 1;
            }

            dq.addLast(dq.pollFirst());
        }
        return answer;
    }
}

 


느낀 점

 

 

점점 변수나 요소들을 추가하다보니, 코드가 지저분해지는 것 같습니다.

처음 설계를 완벽하게 하는 노력이 필요할 것 같습니다. 

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 의상  (0) 2023.09.05
[프로그래머스] 줄 서는 방법  (0) 2023.09.05
[프로그래머스] 숫자 짝궁  (0) 2023.08.31
점프와 순간 이동  (0) 2023.08.21
바탕화면 정리  (0) 2023.08.21