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

JeeHyeok Lee·2023년 9월 22일
0

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/76502

문제 내용

](){}[

다음과 같이 괄호가 주어진다. 괄호를 왼쪽으로 회전하였을 때 올바른 괄호가 되는 경우의 수를 구한다.

문제 풀이

단순하게 문자열을 가장 왼쪽 값을 가장 오른쪽 위치에 놓는 연산을 문자열의 길이만큼 진행하며 올바른 괄호인지에 대한 판단을 진행하였다. (문자열을 이동시키는 연산을 String으로 하면 메모리나 시간의 효율이 좋지는 못하지만 본 문제의 문자열의 길이는 최대 1000개이므로 String을 사용하였다.)

괄호 판단 연산의 경우 여는 괄호가 나올 경우 Stack에 삽입하고 닫는 괄호가 나오면 스택에서 값을 꺼내 비교하여 가장 최근에 삽입된 여는 괄호와 닫는 괄호를 비교하였다.

코드

import java.util.*;
class rotateBracket {
    // 괄호 짝 확인을 위한 해시맵 선언
     HashMap<Character, Character> hashMap = new HashMap<Character, Character>() {{
            put('[', ']');
            put('{', '}');
            put('(', ')');
        }};
    
    public int solution(String s) {
        int answer = 0;
        
        
        for(int i=0; i<s.length(); i++){
            // 가장 왼쪽 값을 마지막에 추가해주며 확인 진행
            answer += check(s);
            s = s.substring(1) + s.charAt(0);
        }
        
        return answer;
    }
    
    public int check(String s){
        // 괄호 짝 확인을 위한 스택 선언
        Stack<Character> stack = new Stack<>();
        char c, ex;
        
        for(int i=0; i<s.length(); i++){
            c = s.charAt(i);
            // 왼쪽 괄호인 경우 스택에 삽입
            if(c == '(' || c == '[' || c == '{'){
                stack.push(c);
            } else if(!stack.isEmpty()) {
                // 오른쪽 괄호인 경우 스택의 값을 꺼내 해시맵을 통해 비교
                ex = stack.pop();
                if(hashMap.get(ex) != c){
                    // 값이 다른 경우 0
                    return 0;
                }
            } else {
                // 오른쪽 괄호가 나왔으나 스택이 비어있는 경우
                return 0;
            }
        }
        
        if(!stack.isEmpty()){
            // 반복문 종료 후 스택이 비어있지 않은 경우
            return 0;
        }
        
        return 1;
        
    }
}

0개의 댓글

관련 채용 정보