본문 바로가기
Algorithm/leetcode

[leetcode] 1021.Remove Outermost Parentheses

by 세류오 2023. 8. 28.

https://leetcode.com/problems/remove-outermost-parentheses/description/

 

Remove Outermost Parentheses - LeetCode

Can you solve this real interview question? Remove Outermost Parentheses - A valid parentheses string is either empty "", "(" + A + ")", or A + B, where A and B are valid parentheses strings, and + represents string concatenation. * For example, "", "()",

leetcode.com

 

문제 이해

  • '()'한쌍의 완전한 괄호 문자열 s가 주어진다
  • s는 "", "(" + A + ")", A+B 의 형태
  •  A는 완전한 괄호를 의미한다.
    • 예시) "", "()", "(())()", "(()(()))" => 유효한 괄호형태
  • s를 입력받아서 가장 바깥 쪽의괄호를 제거 한 후 남은 완전한 괄호 문자열을 return한다
    • 예시: "((())(()()()))" => (())(()()()) 를 리턴한다
      (여기서 이해하기가 조금 힘들었다)

 

문제풀이

  • stack, StringBuilder 사용
  • "(" 가 들어올 때 push()
    • 하지만 size()로 확인 시 stack에 0개 이상이라면 가장 바깥쪽이 존재한다는 것
      StringBuilder에 append()
  • ")"가 들어올 때 pop()
    • size() > 0 라면(가장 바깥 쪽 괄호가 남아있다) append()를 진행
  • StringBiulder에 저장된 값을 toString()을 이용하여 return
class Solution {
    public String removeOuterParentheses(String s) {
        Stack<Character> st = new Stack<>();   
        StringBuilder sb = new StringBuilder(); //괄호 저장
        // 정답 괄호 => stack에 쌓이는 것 없이 바로 사라짐
        // 오답 괄호 => stack에 '('가 하나 무조껀 남게 되며 마지막에 사라지게 된다.
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(c == '('){
                //가장 바깥 쪽 괄호가 존재할 때
                if(st.size() > 0) {
                    sb.append(c);
                }
                st.push(c);
            // ')'가 들어올 차례
            // 2가지의 상황이 존재
            //1. pop이후 stack에 아무것도 남아있지 않을 때
            //2. pop이후 stack에 데이터가 존재할 때(가장 바깥 쪽 괄호)
            } else {
                st.pop();
                if(st.size() > 0){
                    sb.append(c);
                } 
            }
        }
        return sb.toString();
    }
}

 

 

stack을 연습 중 이며

문제를 더 많이 풀어서 얼른 easy난이도들은 쉽게 넘겨버리고 싶다.