프로그래머스 | LV.2 괄호 회전하기 - Stack 활용 문풀 (Java)

728x90

⬛ 프로그래머스 | LV.2 괄호 회전하기 - Stack 활용 문풀

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명


💚나의 풀이

  • 괄호 문자열을 1개씩 회전시킨 문자열 str (= 맨앞글자 맨뒤로) 의 상태가 (), [], {} ‘올바르 괄호’ 문자열인 경우에만 answer++해야하는 문제이다.
  • 올바른 문자열의 판단은 Stack을 활용해야 한다.
  • 여기서 중요한 게, 현재 찍은 charAt(j)의 값과 스택에서 peek()한 값이 짝을 이루어야 pop인데, 짝을 이룰 때 ] [ ← 이런 ‘뒤집어진 모양’은 제외한다.
if(c == ')'  && stack.peek() == '(')
//이런 식으로, 현재 문자열 j로 찍은 값이 닫힌 괄호일 때,
//기존 스택 맨위에 담겨진 괄호가 열린 괄호이면 = '올바른 괄호 문자열' 인 경우다

](){}[ 예를 들어, 이 문자열은 짝이 맞는 거끼리 모두 제거한 뒤에 남은 애가 
   
   ] [ <- 이 모양이다. 이건 뒤집어진 모양이므로 올바르지 않은 괄호가 된다.

나의 풀이 설명

 

💚 제출 코드

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<>();
            //현재 새 str 은 현재 찝은 i ~ 길이 끝까지 뽑고, 그 뒤에 잘린 0, i-1 부분 이어붙임 
            String str = s.substring(i, s.length()) + s.substring(0, i);
            
            for(int j=0; j<str.length(); j++){
                char c = str.charAt(j);
                if(stack.isEmpty()){
                    stack.push(c);
                }else if(c == ')'  && stack.peek() == '('){
                    stack.pop();
                }else if(c == '}' && stack.peek() == '{'){
                    stack.pop();
                }else if(c == ']' && stack.peek() == '['){
                    stack.pop();
                }else{
                    stack.push(c);
                }
            }
            //이 과정 끝난 뒤에 스택 빈상태면 짝이 맞는 경우이므로 
            if(stack.isEmpty()) answer++;
        }
        
        
        return answer;
    }
}
728x90