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

하규진·2023년 2월 24일
0

알고리즘 문제풀이

목록 보기
14/17

문제 설명

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

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

제한사항

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

입출력 예

sresult
"{}"3
"}]()[{"2
"[)(]"0
"}}}"0

입출력 예 설명
입출력 예 #1

다음 표는 "{}" 를 회전시킨 모습을 나타낸 것입니다.
x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?

0"{}"O
1"](){}["X
2"(){}[]"O
3"){}[]("X
4"{}"O
5"}{"X

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

다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?

0"}]()[{"X
1"]()[{}"X
2"()[{}]"O
3")[{}]("X
4"{}"O
5"{}]()["X

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

입출력 예 #3

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

입출력 예 #4

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

나의 풀이

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        
        for(int i =0; i < s.length(); i++){
            Stack<Character> stack = new Stack<>();
            
            for(int j = 0; j < s.length(); j++){
                if(stack.isEmpty()){
                    stack.push(s.charAt(j));
                }
                else if(s.charAt(j) == '}' && stack.peek() == '{'){
                    stack.pop();
                }
                else if(s.charAt(j) == ')' && stack.peek() == '('){
                    stack.pop();
                }
                else if(s.charAt(j) == ']' && stack.peek() == '['){
                    stack.pop();
                }
                else {
                    stack.push(s.charAt(j));
                }
            }
            if(stack.isEmpty()){
                answer++;
            }
            s = rotate(s);
            
        }
        


        return answer;
    }
    String rotate(String s){
        return s.substring(1) + s.charAt(0);
    }
}

돌아보기

처음에는 큐에다가 모든 문자를 넣은 다음 큐의 첫글자를 빼서 뒤에 넣는 방식으로 시도를 했었다.
하지만 생각해보니 큐에서는 원하는 글자를 뽑아 비교할 수가 없었다.
그러다 힌트로 substring에 대해서 보았다.
그걸 활용해 풀 수 있었다.
어떤 사람은 k를 j부터 시작해 문자열의 길이에 j를 더한값 까지 진행하면서
문자열의 인덱스를 k를 문자열 길이로 나눈 것의 나머지값을 활용해 풀던데 정말 굉장했다...

역시 코딩은 수학과에게 유리..

잡설

저번주 일요일에 하나은행 코딩테스트를 보았다. 풀면서 음 풀리네 하지만 오래걸리네 하면서
하나 못풀고 에잉 다른 사람들은 쉽게 풀었겠지 하고 냈는데
다음날 피드백으로 어렵다는 이야기를 많이 받았다고 문자로 알려줬다.
이런거 알려주는데는 또 처음
받고서 음..내가 푼게 잘못되었나 보군 하고 넘어갔지만
역시나 결과는....탈.락.ㅠㅠ
더? 열심히 공부하고 노력해야겠다.
파이팅!

출처 : 프로그래머스
profile
원리를 제대로 알고 사용하자!

0개의 댓글