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

HeavyJ·2023년 6월 4일
0

프로그래머스

목록 보기
7/7

괄호 회전 하기 링크

문제 풀이

이 문제의 핵심은 괄호를 회전하고 + 괄호 문자열이 올바른지 확인하는 것입니다.

괄호를 회전하는데 제가 사용할 자료구조는 Queue

Queue에 해당 문자열을 넣고 queue.poll(), queue.add() 하는 방식으로 괄호를 한 칸씩 당길겁니다.

문자열이 올바른지 확인하기 위해 사용할 자료구조는 Stack입니다.

Stack에 해당 문자열을 넣고 stack.peek() == 현재 넣고 싶은 문자열인지 확인합니다.

substring으로 문자열을 분리해서 Queue에 넣습니다.

반복문을 돌리면서 Stack을 사용
),},]의 3가지 경우에 해당하는 문자 일치 여부를 확인합니다. 괄호 일치 여부확인은 아래 코드로 확인할 수 있습니다.

구현 코드

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        
        // 다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의
        
        // 만약 A가 올바른 괄호 문자열이라면 (A), [A], {A} 도 올바른 괄호 문자열
        // 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
        
        // 만약 A,B 가 올바른 괄호 문자열이라면 AB도 올바른 괄호 문자열입니다. 
        // 예를 들어, {}와 ([]) 가 올바른 괄호 문자열이므로 {}([])도 올바른 괄호 문자열입니다.
        
        // 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 S가 매개변수로 주어진다
        // 이 s를 왼쪽으로 x칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 
        // return 하도록 solution 함수를 완성
        
        // [](){} -> 3
        
        // }]()[{
                
        Queue<String> queue = new LinkedList<>();
        
        for(int i = 0; i < s.length(); i++){
            String str = s.substring(i,i+1);
            queue.add(str);
        }
        
        
        for(int i = 0; i < s.length(); i++){
            String firstStr = queue.poll();
            queue.add(firstStr);
            
            Stack<String> stack = new Stack<>();
            
            // stack에 전부 넣기
            for(int j = 0; j < s.length(); j++){
                String waitingStr = queue.poll();
                queue.add(waitingStr);
                
                if(stack.isEmpty()){
                    stack.push(waitingStr);
                } 
                else if(waitingStr.equals(")") && stack.peek().equals("(")){
                    stack.pop();
                }
                else if(waitingStr.equals("]") && stack.peek().equals("[")){
                    stack.pop();
                }
                else if(waitingStr.equals("}") && stack.peek().equals("{")){
                    stack.pop();
                }
                else{
                    stack.push(waitingStr);
                }
                
            }
            
            if(stack.isEmpty()){
                answer++;
            }
            
        }
        
        return answer;
    }
}
profile
There are no two words in the English language more harmful than “good job”.

0개의 댓글