https://leetcode.com/problems/generate-parentheses/description/

코드설명

완전탐색(BuretForce) 를 활용합니다.

 

처음부터 Well-Formed만 만들어내기는 어렵다고 판단하여, 모든 경우를 만들고, 그 중에 Well-Formed만 필터링해나갔습니다.

 

하지만, 처음부터 Well-Formed를 만들어내는 훨씬 효율적인 방식이 존재합니다.

코드

모든 경우를 다 만들고 Well-Formed만 걸러내는 코드입니다.

import java.util.*;
class Solution {
    //make whole and filtering well-formed Parenthese
    // Time COmplexity : : O(2^16) = 1024 * 32
    List<String> answer = new ArrayList<String>();
    public List<String> generateParenthesis(int n) {
        DFS(n, n, new Stack<Character>());
        return answer;
    }

    void DFS(int o, int c, Stack<Character> st){
        if(o == 0 && c == 0){
            //cannot init by deep copy with parameter st. check it. 
            // Stack<Character> storeSt = new Stack<>(st);
            Stack<Character> newStack = new Stack<>();
            for(Character v : st){
                newStack.push(v);
            }
            if(isWellFormed(newStack)){
                StringBuilder sb = new StringBuilder();
                for(Character v : st){
                    sb.append(v);
                }
                answer.add(sb.toString());
            }
            return ;
        }

        if(o > 0){
            st.push('(');
            DFS(o - 1, c, st);
            st.pop();
        }
        if(c > 0){
            st.push(')');
            DFS(o, c - 1, st);
            st.pop();
        }
        return ;
    }
    boolean isWellFormed(Stack<Character> st){
        int cCnt = 0;
        while(!st.isEmpty()){
            Character  ch = st.pop();
            if(ch == ')'){
                cCnt += 1;
            }
            else if(ch == '('){
                if(cCnt == 0){
                    return false;
                }
                cCnt -= 1;
            }
        }

        return true;
    }

}

 

더 효율적인 방식입니다. 처음부터 Well-Formed만 만들어냅니다.

이 풀이의 경우 '('가 항상 ')'보다 먼저 앞에 있어야 한다는 특징을 이용한 코드입니다.

즉, ')'의 경우 항상 '('가 ')'의 개수보다 많아야만 괄호를 닫을 수 있습니다.

import java.util.*;
class Solution {
    List<String> answer = new ArrayList<String>();
    int N;
    public List<String> generateParenthesis(int n) {
        N = n;
        DFS(0, 0, new String(""));
        return answer;
    }

    void DFS(int o, int c, String str){
        if(o == c && o + c == N * 2){
            answer.add(str);
            return ;
        }

        if(o < N){
            DFS(o + 1 , c, str + "(");
        }

        if(o > c){
            DFS(o, c + 1, str + ")");
        }
    }

}

+ Recent posts