programmers_괄호 변환_java

2023. 4. 22. 12:11Algorithm/Programmers

728x90

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;

class Solution {
    public String solution(String p) {
        String answer = "";
        answer = step(p);
               
        return answer;
    }   
    
    public String step(String p){
        if(step1(p)){ // 빈 문자열 일경우
            return "";
        }else{
            String[] str = step2(p); // u, v 분리
            if(step3(str[0])){ // u가 올바른 문자열
                return str[0] + step(str[1]); // v를 1단계부터 실행
            }else{
                StringBuilder sb = new StringBuilder();
                sb.append("("); // 4-1 빈 문자열에 ( 추가
                sb.append(step(str[1])); // 4-2 v에 대해 수행 결과 추가
                sb.append(")"); //4-3 ) 추가
                sb.append(step4_4(str[0])); // 4-4 양쪽 끝 제거 후 문자열 괄호 역전
                return sb.toString();
            }
        }
    }
    
    // 1. 입력이 빈 문자열인경우, 빈 문자열을 반환합니다.
    public boolean step1(String s){
        if(s.equals("")){
            return true;
        }else{
            return false;
        }
    }
    
    //2 문자열 w를 두 균형 잡힌 괄호 문자열로 분리합니다.
    public String[] step2(String s){
        int open = 0, close = 0;
        String[] res = new String[2];
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i< s.length(); i++){
            char c = s.charAt(i);
            sb.append(c);
            if(c == '('){
                open++;
            }else if(c==')'){
                close++;
            }
            
            if(open == close){
                String u = sb.toString();                
                String v = "";
                if(i+1 < s.length()){
                    v = s.substring(i+1);
                }
                res[0] = u;
                res[1] = v;
                return res;
            }
        }
        return res;
    }
    
    // 3.문자열 u가 올바른 괄호 문자열 이라면
    public boolean step3(String s){
        Stack<Character> stack = new Stack<>();
        
        for(int i = 0; i<s.length(); i++){
            char c = s.charAt(i);
            if(c == '('){
                stack.push('(');
            }else if(c==')'){
                if(stack.isEmpty()){
                    return false;
                }else{
                    stack.pop();
                }
            }
        }
        
        if(stack.isEmpty()){
            return true;
        }else {
            return false;
        }
    }
    
    // 4-4 첫번째와 마지막 문자 제거 후 나머지 괄호 역전
    public String step4_4(String s){
        StringBuilder sb = new StringBuilder();
        for(int i = 1; i<s.length()-1; i++){
            char c = s.charAt(i);
            if(c=='('){
                sb.append(")");
            }else if(c == ')'){
                 sb.append("(");
            }
        }
        return sb.toString();
    }
}